2012-03-29 9 views
1

aktualisiert habe ich ein Dokument, um das wie dieses Problem

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

sieht: ich eine OrderItem finden will, die entweder productId oder sku mit Wert Produkt-sku- hat 1 und die Menge auf 2

So setzt, habe ich versucht, die folgenden

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

Dies mir einen Fehler

gibt
"can't append to array using string field name [$]" 

Wenn ich den oder Zustand und Abfrage auf nur ein Feld von Unter Dokument wie unten zu entfernen, funktioniert alles wie erwartet funktioniert gut mit der Menge auf 2.

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

Meine Anwendung entweder sku oder productId empfängt als das Identifizierungsfeld Ich weiß nicht, ob es eine sku oder productId zum Zeitpunkt der Abfrage ist. Also muss ich in der Lage sein, eines der Felder im Unterdokument abzufragen und die Menge zu aktualisieren.

Beachten Sie, dass das Update atomar durchgeführt werden muss. Ich möchte wirklich nicht zwei Updates nacheinander machen.

Fehle ich hier etwas? Gibt es eine andere elegante Art, es zu tun?

+2

ich die Antwort gefunden, nachdem sorgfältig den Unterschied zwischen Punktnotation Lesen und Unterobjekte http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+ in + Objekte% 29 – VikramG

Antwort

4

Ich fand die Antwort nach sorgfältigem Lesen des Unterschieds zwischen Punktnotation und sub-objects in this post. Ich kam zu folgender Lösung:

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

Diese Verwendung von $ wird nicht unterstützt. $ Oder query legt den Wert des $ positional-Operators nicht fest, daher denkt MongoDB, dass Sie nach einem Feld namens "$" suchen, das verboten ist.

Ich schlage vor, dass Sie einfach zwei Updates, eine Filterung durch productId, die andere Filterung durch sku. Nur eines der Updates wird tatsächlich ein Dokument ändern.

+0

Ich verwende derzeit den Ansatz für mehrere Aktualisierungen. Ich wollte sehen, ob es einen Weg gibt, es in einem Update zu machen. Danke, dass Sie sich die Zeit genommen haben, um den Fehler zu erklären. – VikramG

Verwandte Themen