2012-01-24 2 views
4

В документации Mongoose по следующему адресу: http://mongoosejs.com/docs/embedded-documents.htmlMongoose встроенных документов/DocumentsArrays ID

Существует утверждение:

DocumentArrays имеет специальный идентификатор метода, который фильтрует ваши встроенные документов по их _id (каждый внедренный документ получает один):

Рассмотрите следующий фрагмент:

post.comments.id(my_id).remove(); 
    post.save(function (err) { 
    // embedded comment with id `my_id` removed! 
    }); 

Я посмотрел на данные, и нет _ID s для вложенных документов, казалось бы, подтверждают это сообщение:

How to return the last push() embedded document

Мой вопрос:

Соответствует ли документация? Если да, то как мне узнать, что такое «my_id» (в примере), чтобы сделать в первую очередь '.id (my_id)'?

Если документация неверна, безопасно использовать индекс как идентификатор в массиве документов или я должен создать уникальный идентификатор вручную (согласно указанному сообщению).

ответ

12

Вместо того, чтобы делать отжимания() с объектом JSON, как это (путь мангуст документы свидетельствуют):

// create a comment 
post.comments.push({ title: 'My comment' }); 

Вы должны создать реальный экземпляр вашего внедренного объекта и push(), что вместо этого. Затем вы можете напрямую захватить поле _id, потому что мангуст устанавливает его, когда объект создается. Вот полный пример:

var mongoose = require('mongoose') 
var Schema = mongoose.Schema 
var ObjectId = Schema.ObjectId 

mongoose.connect('mongodb://localhost/testjs'); 

var Comment = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

var BlogPost = new Schema({ 
    author : ObjectId 
    , title  : String 
    , body  : String 
    , date  : Date 
    , comments : [Comment] 
    , meta  : { 
     votes : Number 
     , favs : Number 
    } 
}); 

mongoose.model('Comment', Comment); 
mongoose.model('BlogPost', BlogPost); 

var BlogPost = mongoose.model('BlogPost'); 
var CommentModel = mongoose.model('Comment') 


var post = new BlogPost(); 

// create a comment 
var mycomment = new CommentModel(); 
mycomment.title = "blah" 
console.log(mycomment._id) // <<<< This is what you're looking for 

post.comments.push(mycomment); 

post.save(function (err) { 
    if (!err) console.log('Success!'); 
}) 
+0

Спасибо - так что я ясно: ты говоришь, что _id является свойство реализованным «комментарий» (встроенный документ), но не обязательно «поле» в базе данных? В моих данных у меня нет полей _id для встроенных документов только для моделей. – Lewis

+0

Это сработало, спасибо! – Lewis

+0

Но разве это не сделало бы их обособленными экземплярами? Если вы обновите модель комментариев, отразится ли она на изменении модели блога? – Neikos

Смежные вопросы