Mongoose - 更新嵌套数组中的字段

Posted

技术标签:

【中文标题】Mongoose - 更新嵌套数组中的字段【英文标题】:Mongoose - Update field in nested array 【发布时间】:2017-07-05 18:11:36 【问题描述】:

我有一个看起来像这样的集合


  "_id":ObjectId("58a5a40663d24e0498ecf5e1"),
  "picture":null,
  "close":
    "hour":19,
    "minute":30
  ,
  "open":
    "hour":7,
    "minute":0
  ,
  "location":
    "latitude":-6.304718,
    "longitude":106.64337
  ,
  "address":"abcd",
  "placeName":"xyz",
  "floor":[
    
      "number":1,
      "slot":[
        
          "id":"A1",
          "availability":true
        ,
        
          "id":"A2",
          "availability":true
        ,
        
          "id":"A3",
          "availability":true
        ,
        
          "id":"A4",
          "availability":true
        ,
        
          "id":"A5",
          "availability":true
        ,
        
          "id":"B1",
          "availability":true
        ,
        
          "id":"B2",
          "availability":true
        ,
        
          "id":"B3",
          "availability":true
        ,
        
          "id":"B4",
          "availability":true
        ,
        
          "id":"B5",
          "availability":true
        
      ]
    ,
    
      "number":3,
      "slot":[
        
          "id":"A1",
          "availability":true
        ,
        
          "id":"A2",
          "availability":true
        ,
        
          "id":"A3",
          "availability":true
        ,
        
          "id":"B4",
          "availability":true
        ,
        
          "id":"B5",
          "availability":true
        
      ]
    
  ],
  "__v":0

现在我想更新 slot.id 与给定查询匹配的“可用性”字段之一。

当我想用这段代码更新时

ParkingPlace.findOneAndUpdate(
  '_id': mongoose.Types.ObjectId(placeID),
  'floor': 
    $elemMatch: 
      'number': body.floor
    
  ,
  'floor.slot': 
    $elemMatch: 
      'id': body.slot
    
  
, 
  $set: 
    'slot.$.availability': false
  
, function (err, docs) 
  if (err) 
    res.json(err);
   else 
    res.json(docs);
  
);

返回文档,应该表示成功,但数据库中的“可用性”字段仍未更新。

有谁知道为什么以及如何解决它?

**编辑: 我的意思是数据库上的“可用性”字段仍然设置为 true,即使我已经将其设置为 false。

【问题讨论】:

【参考方案1】:

你可以使用new option:

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

ParkingPlace.findOneAndUpdate(
  '_id': mongoose.Types.ObjectId(placeID),
  'floor': 
    $elemMatch: 
      'number': body.floor
    
  ,
  'floor.slot': 
    $elemMatch: 
      'id': body.slot
    
  
, 
  $set: 
    'slot.$.availability': false
  
, 
  new: true
, function (err, docs) 
  if (err) 
    res.json(err);
   else 
    res.json(docs);
  
);

【讨论】:

我的意思是即使在数据库中,'availability'字段仍然设置为true,即使我已经将它设置为false

以上是关于Mongoose - 更新嵌套数组中的字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 javascript 数组方法更新 mongoose 中的嵌套数组

使用 Mongoose.js 按嵌套数组中的字段排序

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

如何更新(删除)嵌套数组中的文档

更新了 Mongoose 更新嵌套数组元素 [重复]

Mongoose更新嵌套数组