如果某个元素在mongodb中不存在或更新,则推入该数组元素



我必须根据从req.value获得的字符串更新文档内的数组。

我的收藏

[
  {
    "_id": 1,
    "key": [
      "1-value-1",
      "1-value-2"
    ]
  },
  {
    "_id": 2,
    "key": [
      "2-value-1",
      "2-value-2"
    ]
  }
]

我有另一个字符串newString。让我们假设两个条件:

  • req.value在数组中时,将数组值替换为newString
  • else rew.value不存在,将newString推入数组。

例如:在这种情况下,我有一个newString = 1-value-3req.value = 1-value-2替换数组值1-value-2 to 1-value-3。如果req.value不在数组中,则将newString的值push到数组中。

这是我要对其执行操作的集合。

谢谢你提前回答。

使用管道更新

查询

  • 如果1-value-2 exists更改为1-value-3
  • else ' push 1-value-3在数组的末尾(我认为你想要这个)
  • 过滤器检查是否存在
  • 如果存在映射更新
  • else concat添加到数组的末尾

Playmongo(update,exists)
Playmongo(push(concat), missing)

update(
{"_id": {"$eq": 1}},
[{"$set": 
   {"v2-exists": 
     {"$ne": 
       [{"$filter": 
           {"input": "$key", "cond": {"$eq": ["$$this", "1-value-2"]}}},
         []]}}},
 {"$set": 
   {"key": 
     {"$cond": 
       ["$v2-exists",
         {"$map": 
           {"input": "$key",
            "in": 
             {"$cond": 
               [{"$eq": ["$$this", "1-value-2"]}, "1-value-3", "$$this"]}}},
         {"$concatArrays": ["$key", ["1-value-3"]]}]}}},
 {"$unset": ["v2-exists"]}])

更新操作符

Query1(check if exists)

find({"_id": {"$eq": 1}, "key": {"$elemMatch": {"$eq": "1-value-2"}}})

如果query1为空,则发送此(最后推送)

update(
{"_id": {"$eq": 1}},
{"$push": {"key": "1-value3"}})

else send this (set to replace old value)

update(
{"_id": {"$eq": 1}},
{"$set": {"key.$[m]": "1-value-3"}},
{"arrayFilters": [{"m": {"$eq": "1-value-2"}}]})

最新更新