簡體   English   中英

Casbah MongoDB,如何在單個操作中向數組添加和刪除值到多個文檔?

[英]Casbah MongoDB, how to both add and remove values to an array in a single operation, to multiple documents?

搜索之后,我無法弄清楚如何對單個字段執行多個更新。

我有一個帶有“tags”數組字段的文檔。 在開始更新之前,每個文檔都會有隨機標記。 在單個操作中,我想添加一些標簽並刪除一些標簽。

以下更新運算符返回錯誤“指定的無效修飾符:$和”

    updateOperators: { "$and" : [
      { "$addToSet" : { "tags" : { "$each" : [ "tag_1" , "tag_2"]}}},
      { "$pullAll" : { "tags" : [ "tag_2", "tag_3"]}}]}  

    collection.update(query, updateOperators, multi=true)  

如何在單個操作中向多個文檔添加和刪除數組?

您不需要$and更新查詢,但是您無法同時使用更新更新兩個字段 - 正如您在shell中嘗試以下操作時所看到的那樣:

db.test.update({}, { "$addToSet" : { "tags" : { "$each" : [ "tag_1" , "tag_2"]}}, 
                     "$pullAll"  : { "tags" : [ "tag_2", "tag_3"] }}, true, false)

您將Cannot update 'tags' and 'tags' at the same time錯誤消息。 那么如何實現呢? 使用此模式,您需要在多個操作中執行此操作,您可以使用新的批量操作api ,如下所示(shell):

var bulk = db.coll.initializeOrderedBulkOp();
bulk.find({ "tags": 1 }).updateOne({ "$addToSet": { "$each" : [ "tag_1" , "tag_2"]}});
bulk.find({ "tags": 1 }).updateOne({ "$pullAll": { "tags": [ "tag_2", "tag_3"] } });
bulk.execute();

或者在Casbah中使用dsl助手:

val bulk = collection.initializeOrderedBulkOperation
bulk.find(MongoDBObject("tags" -> 1)).updateOne($addToSet("tags") $each("tag_1", tag_2"))
bulk.find(MongoDBObject("tags" -> 1)).updateOne($pullAll("tags" -> ("tags_2", "tags_3")))
bulk.execute()

它不是原子的,並且不能保證沒有其他任何東西會嘗試修改,但它與你目前得到的一樣接近。

Mongo進行原子更新,因此您可以在數組中構建所需的標記,然后替換整個數組。

我建議不要使用數組來存儲這些值,因為這是一個“未綁定”的標簽數組。 未綁定的數組會導致磁盤上的移動,從而導致索引更新,操作系統和mongo可以正常工作。

相反,您應該將每個標記作為單獨的文檔存儲在不同的集合中,並根據相關文檔的_id“ 存儲 ”它們。

{_id : <_id> <key> <value>} - single docuemnt

這將允許您使用db.collection.find({_ id:/ ^ <_ id> /})查詢單個用戶的所有標記並存儲結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM