Mongodb 将多个addToSet请求分组到单个请求中

Mongodb 将多个addToSet请求分组到单个请求中,mongodb,mongodb-query,Mongodb,Mongodb Query,我有以下文件: { "recordKey": "FOO", "channels": [{ "id": "CH1", "blocks": [] }, { "id": "CH2", "blocks": [] }] } 在我当前的用例中,我正在使用addToSet操作符执行两个请求,以便为通道CH1或CH2添加新块,例如,对于通道CH1,我正在执行以下操作: selector = { "$and" : [ { "recordKey" : "FOO" }, {

我有以下文件:

{
 "recordKey": "FOO",
 "channels": [{
 "id": "CH1",
 "blocks": []
 }, {
 "id": "CH2",
 "blocks": []
 }]
}
在我当前的用例中,我正在使用
addToSet
操作符执行两个请求,以便为通道
CH1
CH2
添加新块,例如,对于通道
CH1
,我正在执行以下操作:

selector = 
{
  "$and" : [ {
    "recordKey" : "FOO"
  }, {
    "channels.id" : "CH1"
  } ]
}
addChunkRequest = "$addToSet" : {
    "channels.$.blocks" : {
      "$each" : [ {
        "startime" : 101000000,
        "blockType" : "DATA",
        "fileLoc" : "/tmp/f1",
        "nsamples" : 1000
      }

query1 = db.collection.update(selector, update)
我对CH2频道也有同样的想法。现在,我想将两个请求分组到一个请求中。我怎样才能做到这一点

当然,您不能“在一个操作中更新多个数组元素”,因为这是目前不允许的,并且是对操作的限制

但是,您“可以”做的是在“单个请求”中向服务器发出“两个”操作:

var data = [
  {
    "channel": "CH1",
    "blocks": [{
        "startime" : 101000000,
        "blockType" : "DATA",
        "fileLoc" : "/tmp/f1",
        "nsamples" : 1000
    }]
  },
  {
    "channel": "CH2",
    "blocks": [{
        "startime" : 202000000,
        "blockType" : "DATA",
        "fileLoc" : "/tmp/f2",
        "nsamples" : 2000
    }]
  }
]

var ops = data.map(d => ({
  "updateOne": {
    "filter": { "recordKey": "FOO", "channels.id": d.channel },
    "update": {
      "$addToSet": { "channels.$.blocks": { "$each": d.blocks } }
    }
  }
});

db.collection.bulkWrite(ops);
所以它仍然是“两个”操作,这是无法避免的,但是它只是来自服务器的“一个”请求和响应,这实际上对您有很大帮助