在单个请求组多addToSet请求
问题描述:
我有以下文件:在单个请求组多addToSet请求
{
"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。现在我想在一个请求中对这两个请求进行分组。我怎样才能做到这一点?
答
那么你当然不能“在一个操作中更新多个数组元素”,因为这只是目前不允许的和限制的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);
所以它仍然是“两化”操作,并且无法避免,然而这只是服务器的“一个”请求和响应,而且这实际上对你有很大的帮助。