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的主要内容,如果未能解决你的问题,请参考以下文章