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

push an array element if certain element not exists or update in mongodb

我必须根据从 req.value.

获得的字符串更新文档中的数组

我的collection

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

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

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

这是我要对其执行操作的 collection

感谢您提前回答。

使用管道更新

查询

  • 如果 1-value-2 exists 更改为 1-value-3
  • else `将 1-value-3 推入数组的末尾(我想你想要这个)
  • 过滤以检查它是否存在
  • 如果存在要更新的地图
  • else concat 添加到数组末尾

Playmongo(更新,存在)
Playmongo(推送(连接),缺失)

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(检查是否存在)

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

如果query1为空结果发送这个(最后推送)

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

否则发送这个(设置为替换旧值)

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