Mongoose嵌入文档/ DocumentsArrays id

时间:2012-01-24 21:46:00

标签: node.js mongodb mongoose

在以下地址的Mongoose文档中: http://mongoosejs.com/docs/embedded-documents.html

有声明:

  

DocumentArrays有一个特殊的方法ID,用于过滤嵌入的内容   文档由_id属性(每个嵌入文档得到一个):

请考虑以下代码段:

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

我查看了数据,并且嵌入文档没有 _id ,因为这篇文章似乎已经证实了这一点:

How to return the last push() embedded document

我的问题是:

文档是否正确?如果是这样,那么如何找出'my_id'(在示例中)首先执行'。id(my_id)'

如果文档不正确,可以安全地将索引用作文档数组中的id,或者我应该手动生成唯一的ID(根据上述帖子)。

1 个答案:

答案 0 :(得分:12)

而不是像这样使用json对象执行push()(mongoose docs建议的方式):

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

您应该创建嵌入对象的实际实例,而不是push()。然后你可以直接从中获取_id字段,因为mongoose在实例化对象时设置它。这是一个完整的例子:

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!');
})