【问题标题】:Updating a sub document queried with $or condition in mongodb更新mongodb中$or条件查询的子文档
【发布时间】: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


【解决方案1】:

在仔细阅读了点符号和sub-objects in this post之间的区别后,我找到了答案。我得出以下解决方案:

db.order.update(
    { 
      "userId":"johndoe", "state":"CART",
      "orderItems" : { 
          $elemMatch : { $or:[{"productId":"product-sku-1"}, {"sku":"product-sku-1"}] }
      }
    },
    { 
      $set : {"orderItems.$.quantity":2}
    }
)

【讨论】:

    【解决方案2】:

    不支持 $ 的这种用法。 $or 查询没有设置 $ 位置运算符的值,所以 MongoDB 认为您正在寻找一个名为“$”的字段,这是被禁止的。

    我建议您只需发布两个更新,一个按 productId 过滤,另一个按 sku 过滤。只有其中一个更新会实际更改文档。

    【讨论】:

    • 我目前正在使用多重更新方法。我想看看是否有办法在一次更新中做到这一点。感谢您花时间解释引发的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多