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

时间:2016-08-31 09:43:31

标签: node.js mongodb mongoose mongodb-query

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

{
  "result": {
    "ok": 1,
    "nModified": 1,
    "n": 1
  }
}

我的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});
            }
        });
});

这是我的Mongoose架构:

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}
                               }],

             }]
});

我想将数据添加到Feed中。

我的数据库结构

database

我想要新推送的内容。

3 个答案:

答案 0 :(得分:4)

嵌入式方式(当前架构)

如果您想为每个Feed使用一个文档并将子文档推入(嵌入方式),则可以为新创建的Feed _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... */
});

如果您想查询此字段,请不要为user.feed._id添加索引(根据您的版本使用ensureIndexcreateIndex

使用单独的集合

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

您可以使用Multiple Collections vs Embedded Documents here找到有关pro / cons的更多信息。

答案 1 :(得分:0)

你应该使用X year month sum 10 2016 1 450 10 2016 2 670 ... ... ... ... 10 2017 1 200 11 2016 1 460 ,为什么你需要id,当你已经从req机构获得它时?

db.user.insert()

答案 2 :(得分:0)

这是findOneAndUpdate的好例子。

  

查找匹配的文档,根据更新arg更新它,传递任何选项,并将找到的文档(如果有)返回给回调。如果传回回调,则立即执行查询。

     

可用选项

     

new :bool - 如果为true,则返回修改后的文档而不是原始文档。默认为false(在4.0中更改)