2016-04-24 18 views
1

モンゴースを扱うもう一つの問題。以下の例のように文書内のtaskを更新したいと思います。 たとえば、タスクのcompletedフィールドを_id=1projectに更新し、name受信トレイに更新したいとします。 1つのクエリで実行できますか?モンゴースで二重ネストされた配列のフィールドを更新

{ 
    "_id" : ObjectId("5702e0c732faf57c7bb9ebe9"), 
    "email" : "[email protected]", 
    "projects" : [ 
     { 
      "_id" : "1", 
      "name" : "inbox", 
      "tasks" : [ 
       { 
        "_id" : "1", 
        "text" : "First task", 
        "labels" : [ 
         "home", 
         "phone" 
        ], 
        "dueDate" : "2016-03-18T11:10:00", 
        "created" : "2016-03-10T10:10:00", 
        "completed" : true 
       }, 
       { 
        "_id" : "2", 
        "text" : "Second task", 
        "labels" : [ 
         "home", 
         "phone" 
        ], 
        "dueDate" : "2016-03-18T11:10:00", 
        "created" : "2016-03-10T10:10:00", 
        "completed" : false 
       }, 
      ] 
     }, 
     { 
      "_id" : "2", 
      "name" : "work", 
      "tasks" : [ 
       { 
        "_id" : "4", 
        "text" : "Fourth", 
        "labels" : [ 
         "home", 
         "phone" 
        ], 
        "dueDate" : "2016-03-18T11:10:00", 
        "created" : "2016-03-10T10:10:00", 
        "completed" : false 
       } 
      ] 
     } 
    ] 
} 

答えて

4

Mongoでは、ネストされた配列を一度に照会して更新することはできません。ここに必要な位置$演算子は、ネストされた配列をトラバースすることをサポートしていません。 $プレースホルダの交換が単一であるため、位置$オペレータは、このような他のアレイ内にネストされたアレイを横断クエリとして複数のアレイを横断クエリのために使用することができない

documentationから

詳細については、this issueを参照してください。 {:Mongoose.Types.ObjectId(USERID)、 'projects.tasks._id':Mongoose.Types.ObjectId(data.task._id)_id}、 を私はこの User.update( が試した

+0

最後に、forEachを使用してネストされた配列要素をルックアップして更新するために、コールバック内で必要なことを行いました – arthurr

-1

可能です。位置演算子を使用する必要があります。これを試してください:

db.yourCollection.update({ 
     "_id" : ObjectId("5702e0c732faf57c7bb9ebe9"), 
     'projects.tasks._id': '1' 
     }, 
     { $set: { 'projects.tasks.$.completed': newData }} 
    ) 
+0

(エラー、データ)=> { console.log(データ); 返信返信( '成功'); {0セットの{'projects.tasks。$完了':data.task.completed} } ); しかし、私は{ok:0、n:0、nModified:0}を得ました。 – arthurr

+0

多くの理由が考えられます。わからない。私はあなたのmongoshellでまずこれを試してみることをお勧めします(_idを適切に見つけるか、_idの代わりに別のフィールドを試してみてください)。また、更新時に最初のパラメータに別のプロパティを追加することもできます。 'projects._id'のように: '1' –

+0

または、フィールドの種類に問題がある可能性があります。 'completed'がブール値で、Stringフィールドを送信すると、mongoはそのフィールドを変更することを許可しません。私が言ったように、最初にあなたのmongoシェルを試してみる必要があります。 –

関連する問題