findOneAndUpdate 最新文档

Posted

技术标签:

【中文标题】findOneAndUpdate 最新文档【英文标题】:findOneAndUpdate the latest document 【发布时间】: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,并且您想更新最新的文档。对吗? 是的,正是…… 【参考方案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 的对象。您正在更新他们两个俱乐部,这可能是他们无法正常工作的原因。

以上是关于findOneAndUpdate 最新文档的主要内容,如果未能解决你的问题,请参考以下文章

如何从 findOneAndUpdate 方法中获取更新的文档?

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose:findOneAndUpdate 不返回更新的文档

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]