2017-03-06 2 views
1

ich eine Mongo Sammlung workspaces in meinem MongoDB haben, die von Datensätzen bestehen, die wie folgt aussieht wie folgt:eine Sammlung innerhalb Reihe von Sammlungen in MongoDB aktualisiert

{ 
    "_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" 
     } 
    ] 
} 

Jetzt ist mein Ziel ist es, dass ich etwas in einer angehängt werden soll des Datensatzes des Arrays uploads mit den Übereinstimmungskriterien original Feldwert. Zum Beispiel möchte ich in folgenden Weise "pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif" zur {"original" : "DE-20__450_GG_5002_N23_994__0136.tif"} Sammlung anhänge:

{ 
    "_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" 
     } 
    ] 
} 

ich versuchte $elemMatch und anschließend hinzugefügt i $addToSet in folgenden Weise:

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"}}}) 

aber es gibt mir folgende Fehlermeldung:

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

Ich denke, ich habe die Abfrage falsch gemacht kann mir jemand sagen, was los ist und wie kann ich solv e es?

Sorry für mein schlechtes Englisch :) hoffe, du hast verstanden, was ich gesagt habe.

Antwort

1

Hier ist die korrekte Syntax. Sie müssen $set mit postional Operator verwenden, um das Element zu erreichen.

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"}}) 

Weitere Informationen hier https://docs.mongodb.com/manual/reference/operator/update/positional/#update-documents-in-an-array

Sie können Ihre Abfragekriterien vereinfachen. Sie müssen den Operator $elemMatch nicht für die Bedingung einer einzelnen Abfrage verwenden. Sie können Punktnotation verwenden.

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"}}) 

Weitere Informationen hier https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition

+1

Vielen Dank seiner Arbeiten. Sehr geschätzt für den Link ist es wirklich hilfreich, die korrekte Syntax zu verstehen. Auch danke, dass ich der Punktnotation Idee gegeben habe, wusste ich nicht, dass wir es auch bei Sammelarrays verwenden können. – Seeker

Verwandte Themen