我必须根据从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-3
和req.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"}}]})