位置操作符在' findOneAndUpdate '更新查询中指向数组字段的错误元素



我有一个文档

{
"_id": "62ac8190ddb08e6ee5f2c7dd",
"status": "NEW",
"vendor": "62ac8171ddb08e6ee5f2c7ca",
"productsInOrder": [
{
"product": "62ac8176ddb08e6ee5f2c7cd",
"amount": 1
},
{
"product": "62ac8181ddb08e6ee5f2c7d0",
"amount": 1
}
],
"createdAt": "2022-06-17T13:28:48.815Z",
"updatedAt": "2022-06-17T13:39:44.073Z",
"orderNumber": 82,
"__v": 2
}

和更新文档

productsInOrder数组的第二个元素的查询
db.collection.findOneAndUpdate({
status: "NEW",
vendor: "62ac8171ddb08e6ee5f2c7ca",
"productsInOrder.product": "62ac8181ddb08e6ee5f2c7d0",
"productsInOrder.amount": {
$lte: 3
},

},
{
$inc: {
"productsInOrder.$.amount": 1
}
})

执行更新查询后,我希望id为"62ac8181ddb08e6ee5f2c7d0"的产品更新,即它的数量增加1

{
"_id": "62ac8190ddb08e6ee5f2c7dd",
"status": "NEW",
"vendor": "62ac8171ddb08e6ee5f2c7ca",
"productsInOrder": [
{
"product": "62ac8176ddb08e6ee5f2c7cd",
"amount": 1
},
{
"product": "62ac8181ddb08e6ee5f2c7d0",
"amount": 2 // increased by 1
}
],
"createdAt": "2022-06-17T13:28:48.815Z",
"updatedAt": "2022-06-17T13:39:44.073Z",
"orderNumber": 82,
"__v": 2
}

但id为"62ac8176ddb08e6ee5f2c7cd"的产品更新如下https://mongoplayground.net/p/UEU5LCAVjD0

我不明白为什么位置操作符选择数组的第一个元素,而不是在find query

中指定的元素我如何更新在' "productsInOrder.product"中查找查询中指定的相同id的数组元素?

参考文档:

位置$ update操作符在过滤多个数组字段时行为不明确

当服务器执行一个更新方法时,它首先运行一个查询确定要更新哪些文档。如果更新过滤器文档上的多个数组字段,随后调用位置$ update操作符并不总是更新所需的数组中的位置。

因为你的查询指定了productsInOrder.productproductsInOrder.amount,它被认为是对多个数组字段进行过滤。在您的情况下,您应该使用$elemMatch:

db.collection.update({
status: "NEW",
vendor: "62ac8171ddb08e6ee5f2c7ca",
productsInOrder: {
$elemMatch: {
product: "62ac8181ddb08e6ee5f2c7d0",
amount: {
$lte: 3
}
}
}
},
{
$inc: {
"productsInOrder.$.amount": 1
}
})

MongoPlayground

相关内容

  • 没有找到相关文章

最新更新