【问题标题】:findOneAndUpdate the latest documentfindOneAndUpdate 最新文档
【发布时间】:2019-03-06 12:05:08
【问题描述】:

这是我的架构

 var BudgetSchema = mongoose.Schema({
  user_email: { type: String, required: true },
  user_budget: { type: Number, required: true },
  platforms_budget: {
    type: [{
      platform_id: { type: String, required: true },
      platform_name: { type: String, required: true },
      platform_budget_percent: { type: Number, required: true },
      platform_budget: { type: Number, required: true },
    }]
  },
  created: { type: Date, default: Date.now() }
});

var BudgetSchemaExport = module.exports = mongoose.model('Budget', BudgetSchema);

这是函数:

module.exports.updateBudgetPercent = async function (user_email, platform_name, p_budget) {
  var query = {
    "user_email": user_email,
    "platforms_budget": {
      $elemMatch: { "platform_name": platform_name }
    }
  };
  //the location that need to be updated
  var update = { "$set": { "platforms_budget.$[outer].platform_budget_percent": p_budget }  };
  //array's index
  var options = { arrayFilters: [{ "outer.platform_name": platform_name }] };
  var updated = await this.findOneAndUpdate(query, update, options).sort({ created: -1 })
  if (updated) { //if the data was updated
    return true;
  } else {
    return false;
  }
}

该功能的目的是更新特定用户的预算。 我想更新最新的文档,但它会更新最早/第一个。

我尝试了这个选项:var updated = await this.findOneAndUpdate(query, update, options, {sort:{ "created": -1 }}),但出现错误:

events.js:167
      throw er; // Unhandled 'error' event
      ^
TypeError: callback.apply is not a function

有什么想法吗?谢谢。

【问题讨论】:

  • 所以您有多个文档用于同一个user_email,并且您想更新最新的文档。对吗?
  • 是的,正是……

标签: javascript node.js mongodb mongoose schema


【解决方案1】:

upsert: truesort: { created: -1 } 一起使用。这是查询:

var updated = await this.findOneAndUpdate(
  query,
  update,
  {
    upsert: true,
    sort: { created: -1 },
  }
);

希望对你有所帮助。

【讨论】:

  • 谢谢,但还是有回调错误。我还需要传递选项,根据这个mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate,如果我传递 4 个参数,则 4 的参数是一个回调。
  • 另外,我试过这个,但它并没有改变任何东西。 var update = { "$set": { "platforms_budget.$[outer].platform_budget_percent": p_budget },upsert: true, sort: { created: -1 } };
  • 好的,在这里我可以看到您的 update 变量是一个具有 3 个字段的对象。一个是$set 运算符,第二个是upsert,第三个是sort。但实际上在findOneAndUpdate 方法中有3 个不同的参数。不要在更新阶段使用upsertsort。我给你的查询有 3 个参数 queryupdate,第三个是一个有两个字段 upsertsort 的对象。您正在更新他们两个俱乐部,这可能是他们无法正常工作的原因。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 2017-08-13
  • 2022-08-02
  • 2019-10-05
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多