MongoDB中

MongoDB中

问题描述:

更新集合内的阵列集合我有一个蒙戈集合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吗?

对不起,我的英语不好:)希望你明白我说的话。

下面是正确的语法。您必须使用$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