Mongodb 更新多个嵌入文档不起作用

Mongodb 更新多个嵌入文档不起作用,mongodb,mongodb-query,mongodb-php,php-mongodb,Mongodb,Mongodb Query,Mongodb Php,Php Mongodb,我有一个数据表,比如 { _id: .... Name ... "RoomStatusDetails": [ { "StatusEntryId": ObjectId("5bd6ea81d2ccda0a780054da"), "RoomId": "78163a07-76db-83c1-5c22-0749fab73251", "CurrentStatus": ObjectId("5bd17295d2ccda11f0007765"), "StartDate":

我有一个数据表,比如

 {
  _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字段更新为“Inactive”

       $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字段。请帮忙

所有匹配的嵌入文档: 要更新所有匹配的嵌入文档,您应该使用,因为参考匹配的嵌入文档的第一个位置

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

所有匹配的嵌入文档: 要更新所有匹配的嵌入文档,您应该使用,因为参考匹配的嵌入文档的第一个位置

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


您必须使用阵列过滤器才能通过房间id过滤器。 如果没有ArrayFilter,它将更新所有
[]
的“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))
);

您必须使用阵列过滤器才能通过房间id过滤器。 如果没有ArrayFilter,它将更新所有
[]
的“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))
);


使用
update
方法代替
updateOne
。它不起作用。。它抛出未定义的方法更新,我正在使用3.6。即使我使用updateMany,它也不会抛出任何错误消息,但不会更新其他嵌入文档。在使用
update
时显示错误。请使用
$[]
而不是
$
。使用
update
方法代替
updateOne
。它不起作用。。它抛出未定义的方法更新,我正在使用3.6。即使我使用updateMany,它也不会抛出任何错误消息,但不会更新其他嵌入文档。在使用
update
时显示错误。请使用
$[]
而不是
$
。非常感谢……@NidaAmin非常欢迎!在完成某些事情后,我意识到它不是根据roomid更新的。。。正在将其他房间的状态更新为非活动。。。如果状态更改,请帮助/添加新的$bulkbatchStatus=new MongoDB\Driver\BulkWrite(['ordered'=>true])$bulkbatchStatus->update(数组(''u id'=>new MongoDB\BSON\ObjectID($this->id),“RoomStatusDetails”=>array('$elemMatch'=>array(“RoomId”=>$this->RoomId)))、数组('$set'=>array(“RoomStatusDetails.$[].IsActive”=>Inactive”)、数组(“multi”=>true,“upsert”=>false));如果您需要特定的匹配但有多个文档,请检查Veeram answer。非常感谢…@NidaAmin非常欢迎!在完成某些事情后,我意识到它不是根据roomid更新的。。。正在将其他房间的状态更新为非活动。。。如果状态更改,请帮助/添加新的$bulkbatchStatus=new MongoDB\Driver\BulkWrite(['ordered'=>true])$bulkbatchStatus->update(数组(''u id'=>new MongoDB\BSON\ObjectID($this->id),“RoomStatusDetails”=>array('$elemMatch'=>array(“RoomId”=>$this->RoomId)))、数组('$set'=>array(“RoomStatusDetails.$[].IsActive”=>Inactive”)、数组(“multi”=>true,“upsert”=>false));如果您需要特定的匹配但有多个文档,请检查Veeram answer。它不起作用,也不会抛出任何错误消息…您可以显示您的查询吗?$bulkbatchStatus=new MongoDB\Driver\BulkWrite(['ordered'=>true])$bulkbatchStatus->update(数组(''u id'=>new MongoDB\BSON\ObjectID($this->id),“RoomStatusDetails”=>array('$elemMatch'=>array(“RoomId”=>$this->RoomId))、数组('$set'=>array(“RoomStatusDetails.$[room].IsActive”=>Inactive”)、数组(“multi”=>true,“upsert”=>false,“arrayFilters”=>array(“RoomId.RoomId”=>this->->RoomId”));我看不出这个问题有什么不对。您能否确保传递的参数是正确的,并且在db中有一个符合查询条件的匹配文档?参数传递是正确的……它不起作用,也不会抛出任何错误消息……您能否显示您的查询?$bulkbatchStatus=new MongoDB\Driver\BulkWrite(['ordered'=>true])$bulkbatchStatus->update(数组(''u id'=>new MongoDB\BSON\ObjectID($this->id),“RoomStatusDetails”=>array('$elemMatch'=>array(“RoomId”=>$this->RoomId))、数组('$set'=>array(“RoomStatusDetails.$[room].IsActive”=>Inactive”)、数组(“multi”=>true,“upsert”=>false,“arrayFilters”=>array(“RoomId.RoomId”=>this->->RoomId”));我看不出这个问题有什么不对。能否确保传递的参数正确,并且在db中有符合查询条件的匹配文档?参数传递正确。。。。