【问题标题】:Mongoose findOneAndUpdate return only the newly $push documentMongoose findOneAndUpdate 只返回新的 $push 文档
【发布时间】:2020-01-17 22:45:51
【问题描述】:

这是我的收藏“个人资料”的架构:

{ 

    _id : ObjectId("2bb0fad110"), 
    name : "Tommy", 
    defaultrates : 
    [ 
            {_id : ObjectId("444cbcfd52"), rate : 35.0, raisedOn : "5/2/2009"}, 
            {_id : ObjectId("2e642b1510"), rate : 55.0, raisedOn : "5/3/2010"}, 
            {_id : ObjectId("47cc4d69d3"), rate : 65.0, raisedOn : "5/5/2010"} 
    ] 
}

我想 $push 一个嵌入式数组:

{
  _id : new ObjectID(), rate : 60.0, raisedOn : "7/5/2012"
}

并在执行后返回。

所以我通过猫鼬做了这个,

var condition = { '_id': "2bb0fad110"},
  insert = {
    '_id': new ObjectID(),
    'rate': 60.0,
    'raisedOn': "7/5/2012",

  },

  options = { strict: false, new: true };



function callback (err, result) {
  if (err) { console.log(err); res.status(400).send("error"); }
  console.log('result:' + JSON.stringify(result));
  res.json(result);
}


dbmodel.findOneAndUpdate(condition, { $push: { defaultrates: insert } }, options, callback);

返回值(即整个对象)是:

{

  _id : ObjectId("2bb0fad110"), 
  name : "Tommy", 
  defaultrates : 
  [ 
      {_id : ObjectId("444cbcfd52"), rate : 35.0, raisedOn : "5/2/2009"}, 
      {_id : ObjectId("2e642b1510"), rate : 55.0, raisedOn : "5/3/2010"}, 
      {_id : ObjectId("47cc4d69d3"), rate : 65.0, raisedOn : "5/5/2010"},
      {_id : ObjectId("65009be546"), rate : 60.0, raisedOn : "7/5/2012"}
  ] 
}

但我的目标是只返回值:

{_id : ObjectId("65009be546"), rate : 60.0, raisedOn : "7/5/2012"}

而不是整个文档。

我该怎么做? 我在这一行中错过了什么:

dbmodel.findOneAndUpdate(condition, { $push: { defaultrates: insert } }, options, callback);

【问题讨论】:

  • 您返回的整个文档带有res.json(result)。如果您只想要新插入的对象,则应该返回insert 值。
  • 那么,我的语法应该是什么?

标签: javascript node.js mongoose


【解决方案1】:

当您获得完整更新的对象时(由于{ new: true } 选项),您可以使用 JavaScript 定位嵌入文档数组中的最后一个元素并将其作为响应发送。

所以有了这个对象...

{
  _id : ObjectId("2bb0fad110"), 
  name : "Tommy", 
  defaultrates : 
  [ 
      {_id : ObjectId("444cbcfd52"), rate : 35.0, raisedOn : "5/2/2009"}, 
      {_id : ObjectId("2e642b1510"), rate : 55.0, raisedOn : "5/3/2010"}, 
      {_id : ObjectId("47cc4d69d3"), rate : 65.0, raisedOn : "5/5/2010"},
      {_id : ObjectId("65009be546"), rate : 60.0, raisedOn : "7/5/2012"}
  ] 
}

你可以这样做...

function callback (err, result) {
  if (err) { console.log(err); res.status(400).send("error"); }
  console.log('result:' + JSON.stringify(result));

  // BELOW ADDED
  const newDefaultRate = result.defaultrates[result.defaultrates.length - 1]; // gets the last element in the array
  res.status(201).json(newDefaultRate); // http status 201 to show new resource created
}

希望这将帮助遇到此线程的人。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2017-08-13
    • 2021-01-02
    • 1970-01-01
    • 2021-01-29
    • 2016-04-25
    • 1970-01-01
    • 2014-09-26
    • 2020-06-25
    相关资源
    最近更新 更多