2016-07-10 8 views
0

Ich versuche, das eingebettete Dokument zu aktualisieren, aber es funktioniert nicht. Dies ist, was Dokumente wie folgt aussehen:MongoDB aktualisierten eingebetteten Dokument funktioniert nicht

{ 
    "_id" : ObjectId("577c71735d35de6371388efc"), 
    "category" : "A", 
    "title" : "Test", 
    "content" : "Test", 
    "tags" : "test", 
    "comments" : [ 
     { 
      "_id" : ObjectId("57811681010bd12923eda0ca"), 
      "author" : "creator", 
      "email" : "[email protected]", 
      "text" : "helloworld!" 
     }, 
     { 
      "_id" : ObjectId("57811b17b667676126bde94e"), 
      "author" : "creator", 
      "email" : "[email protected]", 
      "text" : "helloworld2!" 
     } 
    ], 
    "createdAt" : ..., 
    "updatedAt" : ... 
} 

Sie die Kommentare sehen Feld Dokument eingebettet ist, die Kommentare enthält. Ich möchte Kommentar verfasst aktualisieren, so dass ich Abfrage wie folgt (node.js):

db.update('posts', { 
    _id: new ObjectID(postId), // ID of the post 
    comments: { 
     $elemMatch: { 
      _id: new ObjectId(commentId) 
     } 
    } 
}, { 
    $set: { 
     "comments.$.author": newComment.author, 
     "comments.$.email": newComment.email, 
     "comments.$.text": newComment.text, 
     "comments.$.updatedAt": new Date() 
    } 
}) ... 

, wenn ich diese Abfrage ausführen, wurde kein Fehler angezeigt, aber Update wurde nicht angewendet. Ich habe diese Abfrage auch versucht:

{ 
    _id: new ObjectId(postId), 
    "comments._id": new ObjectId(commentId) 
} 

aber auch nicht funktioniert. Fehle ich etwas? Ich benutze Mongo v3.2.7.

+0

Warum aktualisieren Sie das Kommentarmodell nicht direkt? –

+0

@MedetTleukabiluly wie? – modernator

Antwort

1

Bitte versuchen Sie den folgenden Code. Ich denke, die "ObjectId" (d. H. Fall) sollte das Problem sein. Überprüfen Sie einfach, wie Sie die Objekt-ID definiert haben, und halten Sie sie an den beiden von Ihnen verwendeten Orten konsistent (d. H. Posts _id und Kommentare _id -> beide Orte).

ObjectID = require ('mongodb'). ObjectID

Der Code unten gut für mich funktioniert. Grundsätzlich scheint Ihre Anfrage korrekt zu sein.

var Db = require('mongodb').Db, MongoClient = require('mongodb').MongoClient, Server = require('mongodb').Server, ReplSetServers = require('mongodb').ReplSetServers, ObjectID = require('mongodb').ObjectID, Binary = require('mongodb').Binary, GridStore = require('mongodb').GridStore, Grid = require('mongodb').Grid, Code = require('mongodb').Code, assert = require('assert'); 

var db = new Db('localhost', new Server('localhost', 27017)); 
db.open(function(err, db) { 
    var collection = db.collection("posts"); 

    var postId = '577c71735d35de6371388efc'; 
    var commentId = '57811681010bd12923eda0ca'; 

    var query = { 
     _id : new ObjectID(postId), 
     comments : { 
      $elemMatch : { 
       _id : new ObjectID(commentId) 
      } 
     } 
    }; 

    collection.update(query, { 
     $set : { 
      "comments.$.author" : "new author", 
      "comments.$.email" : "[email protected]", 
      "comments.$.text" : "new email updated", 
      "comments.$.updatedAt" : new Date() 
     } 
    }, { 
     multi : false 
    }, function(err, item) {   
     assert.equal(null, err); 
     console.log("comments updated ..." + JSON.stringify(item)); 
    }); 

}); 
Verwandte Themen