具有多个条件的 Mongoose updateMany() 返回 0

Posted

技术标签:

【中文标题】具有多个条件的 Mongoose updateMany() 返回 0【英文标题】:Mongoose updateMany() with multiple conditions returns 0 【发布时间】:2020-12-16 05:10:10 【问题描述】:

我创建了一个服务来更新我的所有bookings,并在booking.date 过去时将bookings.status 值设置为4(已完成)。 现在我需要更新另一个值booking.catering.state 并将其设置为2(拒绝)当它的初始状态是1(请求)并且booking.date 是过去.

我的代码(第一个片段运行良好),第二个没有。也许问题是由第二个 updateMany() 的多重条件引起的。但是,caterings.nModified 始终返回 0。我错过了什么?。 :

// UPDATE BOOKIGNS WITH PAST DATE OR TODAYS DATE AND PAST HOURS
    const bookings = await Booking.updateMany(
      
        $or: [
           date:  $lt: today  ,
           date: today, end:  $lt: now.getHours()  ,
        ],
      ,
      // SET STATE TO "FINISHED"
       status: 4 
    );

// UPDATE CATERING, WHERE THE STATE IS "1" - REQUESTED
const caterings = await Booking.updateMany(
  
    $or: [
       date:  $lt: today  ,
       date: today, end:  $lt: now.getHours()  ,
    ],
    catering: 
      status: 1,
    ,
  ,
  // SET CATERING STATE TO "DENIED"
  
    catering: 
      status: 2,
    ,
  
);

  console.log(
      "\x1b[32m",
      `[manager]: $bookings.nModified bookings has been updated`
    );
    console.log(
      "\x1b[32m",
      `[manager]: $caterings.nModified caterings has been updated \n`
    );

【问题讨论】:

【参考方案1】:

查询

catering: 
      status: 1,
    ,

仅当 catering 字段包含的文档正好有 1 个字段,该字段名为 status 并且值为 1 时才会匹配。如果有任何其他字段,则匹配将失败。

要检查状态字段的值而不考虑餐饮对象中的任何其他字段,请使用点分表示法:

"catering.status":1

【讨论】:

以上是关于具有多个条件的 Mongoose updateMany() 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

Express.js - Mongoose 多个或条件

具有多个子路径的猫鼬填充路径

Mongoose.js 条件填充

$match mongodb聚合框架_mongoose中的多条件[重复]

$match mongodb聚合框架_mongoose中的多条件[重复]

Mongoose 更新多个文档