2017-06-15 128 views
2

我有以下文件:在单个请求组多addToSet请求

{ 
"recordKey": "FOO", 
"channels": [{ 
"id": "CH1", 
"blocks": [] 
}, { 
"id": "CH2", 
"blocks": [] 
}] 
} 

在我目前的使用情况下,我在做与addToSet操作两个请求添加新块的通道CH1CH2对于例如,用于通道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。现在我想在一个请求中对这两个请求进行分组。我怎样才能做到这一点?

回答

2

那么你当然不能“在一个操作中更新多个数组元素”,因为这只是目前不允许的和限制的positional $ operator

什么你“可以”,然而做的是使用Bulk Operations发出的“单个请求”服务器“都”的操作:

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); 

所以它仍然是“两化”操作,并且无法避免,然而这只是服务器的“一个”请求和响应,而且这实际上对你有很大的帮助。