首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo条件$push

Mongo条件$push
EN

Stack Overflow用户
提问于 2021-08-16 09:46:50
回答 1查看 402关注 0票数 0

我希望基于与数组中已经存在的元素相关的条件将数组推送到数组中。这是我的文件结构:

代码语言:javascript
复制
{'_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按降序日期排序。现在我按这样的方式:

代码语言:javascript
复制
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应该保持不变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 00:46:55

PlayMongo

测试是让{"value": 48,"when": 50}测试另一个文档,替换它,并用新值替换代码中的48,50。

所有可能的情况

case =空数组(添加而不检查anyting)

新Membed= {"value": 43, "when": 50}

代码语言:javascript
复制
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}

代码语言:javascript
复制
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}

代码语言:javascript
复制
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}

代码语言:javascript
复制
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}

代码语言:javascript
复制
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}

代码语言:javascript
复制
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}]}]}

查询

代码语言:javascript
复制
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"
                                              ]
                                            }
                                          ]
                                        }
                                      ]
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                ]
              }
            ]
          }
        }
      }
    }
  }
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68800652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档