在 MongoDB 中更新后检索子文档的 ID

mid*_*n k 3 mongoose mongodb node.js mongodb-query

我编写了一个服务来使用更新语句将新数据推送到我的集合中,我需要检索最后插入数据的 ID。我正在使用db.collection.update它,但它只是给出了这样的响应:

{
  "result": {
    "ok": 1,
    "nModified": 1,
    "n": 1
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 api 是:

app.post('/feeds',function(req,res) {
    var _id         = req.body._id;
    var title       = req.body.title;
    var description = req.body.description;
    var latitude    = Number(req.body.latitude);
    var longitude   = Number(req.body.longitude);
    db.user.update(
        {_id:_id },
          {$push : {
              feed:{
                title: title,
                description:description,
                latitude:latitude,
                longitude:longitude

              }
          }
        },function (err,result) {
            if (err) {
                res.json({"success": '0', "message": "Error adding data"});
            }
            else {
                res.json({'result':result});
            }
        });
});
Run Code Online (Sandbox Code Playgroud)

这是我的猫鼬模式:

var user = new mongoose.Schema({

  username : {type: String},
  email    : {type: String,index: {unique: true}},
  password : {type: String},
  feed     : [{
                title        : {type: String},
                description  : {type: String},
                latitude     : {type:Number},
                longitude    : {type:Number},
                feedImages   : [{
                                imageUrl: {type: String}
                               }],

             }]
});
Run Code Online (Sandbox Code Playgroud)

我想将数据添加到提要。

我的数据库结构

数据库

我想要新推送的提要的 ID。

Dar*_*rio 5

嵌入方式(当前模式)

如果您想为每个提要使用一个文档并将子文档推入(嵌入方式),您可以_id为新创建的提要预先分配一个sub-document

var feedId = new ObjectId();

db.user.update({
  _id: _id
}, {
  $push: {
    feed: {
      _id: feedId,
      title: title,
      description: description,
      latitude: latitude,
      longitude: longitude

    }
  }
}, function(err, result) {
  /* ...your code... */
});
Run Code Online (Sandbox Code Playgroud)

user.feed._id如果您想查询此字段(使用ensureIndexcreateIndex取决于您的版本),请不要忘记添加索引。

使用单独的集合

作为替代方法,您可以使用单独的提要集合,并使用insert包含userId外键的语句。

您可以在此处找到有关使用多个集合与嵌入式文档的利弊的更多信息。