2012-03-29 85 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