mongodb自定义字段_MongoDB有条件地按特定字段在数组中添加$addToSet子文档

有没有办法根据数组子文档中的特定键字段有条件$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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值