2017-03-06 57 views
1

更新集合內的陣列集合我有一個蒙戈集合workspaces在我的MongoDB其中包括看起來像如下記錄:MongoDB中

{ 
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"), 
    "name" : "My workspace", 
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"), 
    "uploads" : [ 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0136.tif" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0134.png" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0136.png" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0134.tif" 
     } 
    ] 
} 

現在我的目標是,我想在一個附加的東西的數組uploads的記錄與匹配標準original字段值。比如我要追加"pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"{"original" : "DE-20__450_GG_5002_N23_994__0136.tif"}收集方式如下:

{ 
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"), 
    "name" : "Objective", 
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"), 
    "uploads" : [ 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0136.tif", 
      "pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0134.png" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0136.png" 
     }, 
     { 
      "original" : "DE-20__450_GG_5002_N23_994__0134.tif" 
     } 
    ] 
} 

我嘗試使用$elemMatch,然後我在下面的方式加$addToSet

db.getCollection('workspaces').update({"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}},{$addToSet:{"uploads.$": {"pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}}}) 

,但它給了我以下錯誤:

Cannot apply $addToSet to a non-array field. Field named '0' has a non-array type object in the document _id: ObjectId('58bdc4a13504f5ed743ad025') 

我想我製作了錯誤的查詢任何人都可以告訴我什麼是錯的,我該如何解決e嗎?

對不起,我的英語不好:)希望你明白我說的話。

回答

1

下面是正確的語法。您必須使用$setpostional運算符才能到達該元素。

db.getCollection('workspaces').update(
{"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}}, 
{$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}}) 

這裏https://docs.mongodb.com/manual/reference/operator/update/positional/#update-documents-in-an-array

您可以簡化您的查詢條件的詳細信息。對於單個查詢條件,您不需要使用$elemMatch運算符。您可以使用點符號。這裏

db.getCollection('workspaces').update(
{"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads.original": "DE-20__450_GG_5002_N23_994__0136.tif"}, 
{$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}}) 

更多信息 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition

+1

非常感謝它的工作。非常感謝鏈接,這對於理解正確的語法非常有幫助。另外感謝給點表示法的想法,我不知道我們可以在收集數組的情況下使用它。 – Seeker