我希望基于与数组中已经存在的元素相关的条件将数组推送到数组中。这是我的文件结构:
{'_id': ObjectId('6118d887066a0b17c9a4a531'),
'array_1': [
{
'id': ObjectId('6118d887066a0b17c9a4a530'),
'array_2': [
{'value': 43, 'when': datetime.datetime(2021, 8, 15, 3, 4, 7, 215000)},
{'value': 42, 'when': datetime.datetime(2021, 8, 15, 2, 4, 7, 215000)},
...
]
},
...
]
}array_2按降序日期排序。现在我按这样的方式:
new_dicts_list = [{'value': 57, 'when': datetime.datetime(2021, 8, 16, 3, 5, 7, 215000)}]
db.collection.update(
{'_id': item_id},
{'$push': {'array_1.$[element].array_2': {'$each': new_dicts_list,'$sort': {'when': -1}}}},
{'arrayFilters': [{'element.id': array_1_id}]}
)我试图实现的是,只有当$push与紧接在它之前的value不同时(value/time对可能不会按顺序插入),我才会实现它。如果value是相同的,array_2应该保持不变。
发布于 2021-08-17 00:46:55
测试是让{"value": 48,"when": 50}测试另一个文档,替换它,并用新值替换代码中的48,50。
所有可能的情况
case =空数组(添加而不检查anyting)
新Membed= {"value": 43, "when": 50}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": []}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 50}]}]}case =首先添加与时间成员中的前一个成员不同的值
新Member= {"value" : 44 "when" : 110}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 44, "when": 110}, {"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}case =首先从时间成员中添加相同的值
新Member= {"value" : 43 "when" : 110}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}case=在中间添加不同的值,与前面的时间成员相加。
新Member= {"value" : 48 ,"when" : 50}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 48, "when": 50}, {"value": 41, "when": 20}]}]}case=添加在中间,相同的值,从前面的时间成员
新Member= {"value" : 41, "when" : 50}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}case=添加到最后,不需要检查值,在时间中没有前面的成员。
新成员= {"value" : 41 , "when" : 10}
Before
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}]}]}
After
{"_id": 1, "array_1": [{"id": 2, "array_2": [{"value": 43, "when": 100}, {"value": 49, "when": 80}, {"value": 45, "when": 60}, {"value": 41, "when": 20}, {"value": 41, "when": 10}]}]}查询
db.collection.update({
"_id": {
"$eq": 1
}
},
[
{
"$addFields": {
"array_1": {
"$map": {
"input": "$array_1",
"as": "m1",
"in": {
"$cond": [
{
"$ne": [
"$$m1.id",
2
]
},
"$$m1",
{
"$mergeObjects": [
"$$m1",
{
"array_2": {
"$let": {
"vars": {
"size_position": {
"$reduce": {
"input": "$$m1.array_2",
"initialValue": [
0,
-1
],
"in": {
"$let": {
"vars": {
"index_pos": "$$value",
"m2": "$$this"
},
"in": {
"$let": {
"vars": {
"index": {
"$arrayElemAt": [
"$$index_pos",
0
]
},
"pos": {
"$arrayElemAt": [
"$$index_pos",
1
]
}
},
"in": {
"$cond": [
{
"$lt": [
50,
"$$m2.when"
]
},
[
{
"$add": [
"$$index",
1
]
},
{
"$add": [
"$$index",
1
]
}
],
[
{
"$add": [
"$$index",
1
]
},
"$$pos"
]
]
}
}
}
}
}
}
}
},
"in": {
"$let": {
"vars": {
"asize": {
"$arrayElemAt": [
"$$size_position",
0
]
},
"position": {
"$arrayElemAt": [
"$$size_position",
1
]
}
},
"in": {
"$switch": {
"branches": [
{
"case": {
"$eq": [
"$$position",
-1
]
},
"then": {
"$switch": {
"branches": [
{
"case": {
"$eq": [
"$asize",
0
]
},
"then": [
{
"value": 41,
"when": 50
}
]
},
{
"case": {
"$let": {
"vars": {
"m3": {
"$arrayElemAt": [
"$$m1.array_2",
0
]
}
},
"in": {
"$eq": [
"$$m3.value",
41
]
}
}
},
"then": "$$m1.array_2"
}
],
"default": {
"$concatArrays": [
[
{
"value": 41,
"when": 50
}
],
"$$m1.array_2"
]
}
}
}
},
{
"case": {
"$eq": [
"$$position",
"$$asize"
]
},
"then": {
"$concatArrays": [
"$$m1.array_2",
[
{
"value": 41,
"when": 50
}
]
]
}
}
],
"default": {
"$let": {
"vars": {
"next_member": {
"$arrayElemAt": [
"$$m1.array_2",
"$$position"
]
}
},
"in": {
"$cond": [
{
"$eq": [
"$$next_member.value",
41
]
},
"$$m1.array_2",
{
"$concatArrays": [
{
"$slice": [
"$$m1.array_2",
0,
"$$position"
]
},
[
{
"value": 41,
"when": 50
}
],
{
"$slice": [
"$$m1.array_2",
"$$position",
"$$asize"
]
}
]
}
]
}
}
}
}
}
}
}
}
}
}
]
}
]
}
}
}
}
}
])https://stackoverflow.com/questions/68800652
复制相似问题