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);
所以它仍然是“两个”操作,这是无法避免的,但是它只是来自服务器的“一个”请求和响应,这实际上对您有很大帮助