MongoDb:在父保存中查找已插入子项的生成ID

时间:2016-07-29 13:38:11

标签: javascript mongodb mongoose

如果我有一个代表帖子的文档,其评论如下:

 {
    "_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?

编辑:我正在使用Mongoose,对不起,忘了说!

2 个答案:

答案 0 :(得分:1)

我假设您在阵列上推送的项目将是最后一项,但这在多用户系统中不起作用。

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

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

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

这就是我要做的事。

答案 1 :(得分:1)

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

正如关于adding sub-documents的Mongoose文档中所述,您可以使用以下代码示例:

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]来访问插入的元素。