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?
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