Mongoose 嵌入文档/DocumentsArrays id

Posted

技术标签:

【中文标题】Mongoose 嵌入文档/DocumentsArrays id【英文标题】:Mongoose embedded documents / DocumentsArrays id 【发布时间】:2012-02-18 03:53:45 【问题描述】:

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

有一个说法:

DocumentArrays 有一个特殊的方法 id 可以过滤你嵌入的 _id 属性的文档(每个嵌入的文档都有一个):

考虑以下 sn-p:

 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】:

而不是使用这样的 json 对象执行 push()(猫鼬文档建议的方式):

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

【讨论】:

谢谢 - 所以我很清楚:你是说 _id 是实例化的“评论”(嵌入文档)的属性,但不一定是数据库中的“字段”?在我的数据中,我没有仅适用于模型的嵌入文档的 _id 字段。 但这不会使它们成为单独的实例吗?如果更新评论模型,是否会反映博客模型的变化?

以上是关于Mongoose 嵌入文档/DocumentsArrays id的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 在表单中嵌入文档

使用 Mongoose 和 Express 创建嵌入式文档

删除 mongoose 中的嵌入文档

如何填充嵌套的 Mongoose 嵌入文档

使用 Mongoose 查询嵌套的嵌入文档

Expressjs Mongoose 发现嵌套的嵌入文档未定义