【问题标题】:Updating multiple embedded document not working [duplicate]更新多个嵌入式文档不起作用[重复]
【发布时间】:2018-10-29 13:54:30
【问题描述】:

我有一个表格,里面有类似的数据

 {
  _id: ....
  Name
  ...
 "RoomStatusDetails": [
 {
   "StatusEntryId": ObjectId("5bd6ea81d2ccda0a780054da"),
   "RoomId": "78163a07-76db-83c1-5c22-0749fab73251",
   "CurrentStatus": ObjectId("5bd17295d2ccda11f0007765"),
   "StartDate": ISODate("2018-10-09T22:00:00.0Z"),
   "Notes": "Notes for in service",
   "Discrepancy": "Discrepency",
   "Waiver": "Waiver",
   "TFlight": "T Flight",
   "IsActive": "Inactive" 
},
 {
   "StatusEntryId": ObjectId("5bd6ecf3d2ccda0a780054db"),
   "RoomId": "78163a07-76db-83c1-5c22-0749fab73251",
   "CurrentStatus": ObjectId("5bd17295d2ccda11f0007766"),
   "StartDate": ISODate("2018-10-16T22:00:00.0Z"),
   "Notes": "Out of service",
   "Discrepancy": "",
   "Waiver": "",
   "TFlight": "",
   "IsActive": "Active" 
    },
    ...
   }

我已经编写了以下代码行,用于根据 RoomId 将 IsActive 字段更新为“非活动”

       $this->collection->updateOne(array('_id' => new MongoDB\BSON\ObjectID($this->id), "RoomStatusDetails" => 
                  array('$elemMatch' => array("RoomId" => $this->RoomId))),
                  array('$set' => array("RoomStatusDetails.$.IsActive" => 'Inactive')), array("multi" => true, "upsert" => false));

上面的代码没有更新所有的 IsActive 字段。请帮忙!!!

【问题讨论】:

标签: mongodb mongodb-query mongodb-php php-mongodb


【解决方案1】:

您必须使用 arrayFilters 来传递房间 ID 过滤器。 如果没有 arrayFilters,它将更新所有 [] "RoomStatusDetails" 数组元素,而不考虑房间 ID 查询过滤器。

有点像

 db.col.update(
   {"RoomStatusDetails.RoomId" :"78163a07-76db-83c1-5c22-0749fab73251"},
   {"$set":{"RoomStatusDetails.$[room].IsActive" : "Inactive"}}, 
   {"arrayFilters":{"room.RoomId":"78163a07-76db-83c1-5c22-0749fab73251"}}
);

在php中

$bulkbatchStatus->update(
  array('_id' => new MongoDB\BSON\ObjectID($this->id), "RoomStatusDetails" => array('$elemMatch' => array("RoomId" => $this->RoomId))), 
  array('$set' => array("RoomStatusDetails.$[room].IsActive" => 'Inactive')), 
  array("multi" => true, "upsert" => false, "arrayFilters" => array("room.RoomId" => $this->RoomId))
);

【讨论】:

  • 它不起作用,也不会抛出任何错误信息...
  • 你能告诉我你的查询吗?
  • $bulkbatchStatus = new MongoDB\Driver\BulkWrite(['ordered' => true]); $bulkbatchStatus->update(array('_id' => new MongoDB\BSON\ObjectID($this->id), "RoomStatusDetails" => array('$elemMatch' => array("RoomId" => $this- >RoomId))), array('$set' => array("RoomStatusDetails.$[room].IsActive" => 'Inactive')), array("multi" => true, "upsert" => false, "arrayFilters" => array("room.RoomId" => $this->RoomId)) );
  • 我没有发现查询有任何问题。你能确保传递的参数是正确的,并且有一个匹配的文档满足 db 中的查询条件吗?
  • 参数传递正确......
【解决方案2】:

所有匹配的嵌入文档:

要更新所有匹配的嵌入文档,您应该使用$[],因为$ 指的是匹配嵌入文档的第一个位置。

位置 $ 运算符充当第一个元素的占位符 匹配查询文档

【讨论】:

  • 非常感谢....
  • @NidaAmin 非常欢迎!
  • 完成某些事情后,我意识到它不是根据 roomid 更新的...它正在将其他房间状态更新为非活动...请帮助
  • / 如果状态改变则添加新 $bulkbatchStatus = new MongoDB\Driver\BulkWrite(['ordered' => true]); $bulkbatchStatus->update(array('_id' => new MongoDB\BSON\ObjectID($this->id), "RoomStatusDetails" => array('$elemMatch' => array("RoomId" => $this- >RoomId))), array('$set' => array("RoomStatusDetails.$[].IsActive" => 'Inactive')), array("multi" => true, "upsert" => false)) ;
  • 如果您想要特定匹配但有多个文档,请查看 Veeram 答案。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2019-09-19
  • 1970-01-01
  • 2017-04-04
  • 2011-12-21
  • 2018-02-28
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多