2012-03-29 83 views
1

与$或条件查询的子文件我有一个顺序的文件看起来像这样更新MongoDB中

{ 
    "_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 
     } 
    ] 
} 

问题:我想找到一个具有任何的productId或SKU与价值产品sku-的OrderItem的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 [$]" 

如果我删除的只是一个像下面的子文件的领域或状况和查询,如设置为2

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

我的应用程序接收或者SKU或作为productId参数的数量预计一切工作正常标识符字段。在查询时我不知道它是sku还是productId。所以,我需要能够查询子文档中的任何一个字段并更新数量。

请注意,我需要以原子方式完成更新。我真的不想一个接一个地做两个更新。

我在这里错过了什么吗?有没有另一种优雅的方式呢?

+2

我发现后仔细阅读点符号和子对象之间的差异,答案http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+ into + Objects%29 – VikramG 2012-03-29 20:33:28

回答

4

在仔细阅读点符号和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} 
    } 
) 
0

不支持$的使用。 $或查询不会设置$位置操作符的值,所以MongoDB认为您正在查找名为“$”的字段,这是禁止的。

我建议你简单地发出两个更新,一个按productId过滤,另一个按sku过滤。只有其中一个更新实际上会更改文档。

+0

我目前使用多种更新方法。我想看看是否有办法在一次更新中做到这一点。感谢您花时间解释抛出的错误。 – VikramG 2012-03-29 20:31:34