【发布时间】:2023-04-04 04:42:01
【问题描述】:
我有一个这样的订单文件
{
"_id" : ObjectId("4f70ba6dfb59c87f6b07a1ad"),
"state" : "CART", "storeId" : "1", "userId" : "johndoe",
"orderItems" : [
{
"productId" : "169",
"offerId" : "112233",
"sku" : "product-sku-1",
"name" : "Product Awesome A",
"quantity" : 1,
"retailPrice" : 495,
"salePrice" : 395
},
{
"productId" : "170",
"offerId" : "112234",
"sku" : "product-sku-2",
"name" : "Product Awesome B",
"quantity" : 1,
"retailPrice" : 595,
"salePrice" : 495
}
]
}
问题:我想找到一个 orderItem,它的 productId 或 sku 的值为 product-sku-1,并将数量设置为 2。
所以,我尝试了以下方法
db.order.update(
{
"userId":"johndoe", "state":"CART",
$or: [
{"orderItems.productId":"product-sku-1"},
{"orderItems.sku":"product-sku-1"}
]
},
{
$set : {"orderItems.$.quantity":2}
}
)
这给了我一个错误
"can't append to array using string field name [$]"
如果我删除 or 条件并仅查询如下子文档的一个字段,则在数量设置为 2 的情况下一切正常。
db.order.update(
{
"userId":"johndoe", "state":"CART",
"orderItems.sku":"product-sku-1"
},
{
$set : {"orderItems.$.quantity":2}
}
)
我的应用程序接收 sku 或 productId 作为标识符字段。查询时不知道是sku还是productId。因此,我需要能够查询子文档中的任一字段并更新数量。
请注意,我需要以原子方式完成更新。我真的不想一个接一个地进行两次更新。
我在这里遗漏了什么吗?还有另一种优雅的方式吗?
【问题讨论】:
-
仔细阅读了点符号和子对象的区别mongodb.org/display/DOCS/… 找到了答案
标签: mongodb