2017-06-15 101 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); 

所以它仍然是「兩化」操作,並且無法避免,然而這只是服務器的「一個」請求和響應,而且這實際上對你有很大的幫助。