返回upserted子文档的_id

时间:2014-09-13 23:57:45

标签: node.js mongodb mongoose subdocument

我到处寻找,无法弄清楚这一点。我们如何在MongoDB / Mongoose中为upserted子文档返回自动生成的_id?

这是我的架构:

var commentsSchema = new mongoose.Schema({
  sid : { type : mongoose.Schema.ObjectId }, // (story who these comments belong to)
  seq : Number, // bucket #
  cmts : [ {
    tx:String,
    un : String, //username
    u:{ type : mongoose.Schema.ObjectId }, //user id
    t:Date
  } ]
});

这是我的查询:

self.model('Comments').update({
        "sid" : sid,
        "seq" : seq
      }, {
        '$addToSet' : {
          "cmts" : {
            "tx":text,
            "u" : uid,
            "un" : uname,
            "t":new Date(),
          }
        }
      },
      {
        "upsert" : true
      }, function(err, comment) {
        if (err)
          return cb(err);
        console.log("le comments:"+JSON.stringify(comment));
        cb(err, comment);
      });

非常感谢任何帮助,谢谢! 亨利

1 个答案:

答案 0 :(得分:0)

Mongoose的update函数只会在其回调中返回errnumAffected,因此您无法在此时知道_id。最简单的方法是在更新完成后查询它。

var query = {
    sid: sid,
    seq: seq
};
var data = {
    $addToSet : {
        cmts : {
            tx: text,
            u: uid,
            un: uname,
            t: new Date(),
        }
    }
};
var options = {
    upsert: true,
};

Comments.update(query, data, options, function(err, numAffected) {
    if (err)  ...
    Comments.findOne(query, function(err, comment) {
        if (err) ...
        console.log(comment._id);
        ...
    })
});

要知道您的评论是否已插入或更新,您可以在更新前始终执行findOne查询,以查看其是否存在。