2016-07-29 61 views
1

如果我有代表与意见后,看起来像这样的文件:的MongoDB:查找父插入孩子的生成的ID保存

{ 
    "_id": "579a2a71f7b5455c28a7abcb", 
    "title": "post 1", 
    "link": "www.link1.com", 
    "__v": 0, 
    "comments": [ 
     { 
     "author": "Andy", 
     "body": "Wish I had thought of that", 
     "_id": "579a2a71f7b5455c28a7abcd", 
     "upvotes": 0 
     }, 
     { 
     "author": "Jim", 
     "body": "Just a comment", 
     "_id": "579a2a71f7b5455c28a7abcc", 
     "upvotes": 0 
     } 
    ], 
    "upvotes": 5 
    } 

在调用(JavaScript)的代码,我添加了一个新的通过推送到post.comments数组,然后使用.save用回调保存该帖子。在保存回调中,我想获取刚刚保存的新评论的生成_id。我该怎么做呢?

当然,我在回调中有父邮件文档,但这没有用,因为我无法告诉哪些评论刚插入。

是否有另一种文档方法或.save回调的替代形式来处理我的情况?

还是我必须遵循我通常会做的事情,并在保存之前自己在评论上生成一个唯一的ID?

编辑:我使用猫鼬,对不起,忘了说!

回答

1

你没有具体说明,但我假设你使用Mongoose,因为标准的MongoDB不会将_id属性添加到子文档中。

由于关于adding sub-documents猫鼬文档中提到的,你可以使用下面的代码示例:

var Parent = mongoose.model('Parent'); 
var parent = new Parent; 

// create a comment 
parent.children.push({ name: 'Liesl' }); 
var subdoc = parent.children[0]; 
console.log(subdoc) // { _id: '501d86090d371bab2c0341c5', name: 'Liesl' } 
subdoc.isNew; // true 

parent.save(function (err) { 
    if (err) return handleError(err) 
    console.log('Success!'); 
}); 

而不是parent.children[0]你必须使用parent.children[parent.children.length - 1]访问插入的元素,虽然。

+0

我将按照建议阅读Mongoose文档。我有所有经典的多用户问题......所以我想查看详细信息。 – kpollock

+0

好吧,看起来不错,自动生成的ID设置*之前*新的subdoc从save()返回,所以它适用于多用户,相当于使用Types.ObjectID()手动添加唯一ID。甜! – kpollock

1

我会假设你在数组上推送的项目是最后一个,但是这在多用户系统中不起作用。

此外,您可以对作者和评论字段进行比较,虽然这看起来很麻烦,但只有作者和评论文本,您可能无法确保匹配。

最后,您还可以创建对象ID并将其分配给注释,然后保存它。你这样做:

var mongoose = require('mongoose'); 
var id = mongoose.Types.ObjectId(); 

这就是我会做的。

+0

是的,这是一个经典的多用户错误,我感谢总是亲自设法避开(但在过去几年中已经看过很多次)。感谢Types.ObjectId()函数的提示! – kpollock