有没有办法根据数组子文档中的特定键字段有条件$addToSet?
这是我的意思的一个例子 – 给出由以下示例引导程序生成的集合;
cls
db.so.remove();
db.so.insert({
"Name": "fruitBowl",
"pfms" : [
{
"n" : "apples"
}
]
});
n定义唯一的文档密钥.我只希望一次在数组中具有相同n值的一个条目.所以我希望能够使用n更新pfms数组,以便我最终得到这个;
{
"Name": "fruitBowl",
"pfms" : [
{
"n" : "apples",
"mState": 1111234
}
]
}
这就是我现在所处的位置;
db.so.update({
"Name": "fruitBowl",
},{
// not allowed to do this of course
// "$pull": {
// "pfms": { n: "apples" },
// },
"$addToSet": {
"pfms": {
"$each": [
{
"n": "apples",
"mState": 1111234
}
]
}
}
}
)
不幸的是,这增加了另一个数组元素
db.so.find().toArray();
[
{
"Name" : "fruitBowl",
"_id" : ObjectId("53ecfef5baca2b1079b0f97c"),
"pfms" : [
{
"n" : "apples"
},
{
"n" : "apples",
"mState" : 1111234
}
]
}
]
我需要有效地将匹配在n上的apples文档作为唯一标识符,并且只需设置mState是否已存在条目.很遗憾我不能在同一份文件中做$pull和$addToSet(我试过).
我真正需要的是字典语义,但现在不是一个选项,也不是打破文档 – 任何人都可以想出另一种方式吗?
FWIW – 现有格式是语言/驱动程序序列化的结果,我没有完全选择它.
进一步
在我知道数组元素已经存在的情况下我已经进一步了解我可以做到这一点;
db.so.update({
"Name": "fruitBowl",
"pfms.n": "apples",
},{
$set: {
"pfms.$.mState": 1111234,
},
}
)
但当然这只会起作用;
>对于单个数组元素
>只要我知道它存在
第一个限制不是灾难,但是如果我无法有效地将$addToSet与之前的$set(当然我不能)结合或组合,那么我现在能想到的唯一解决方法就是两个DB轮-trips.