Ich habe ein Dokument Schema in MongoDB, die wie folgt aussieht:aktualisiert Multi verschachtelter Array in MongoDB
{
_id: 1
tags: [{
tag: 'foo'
links: [{
link: 'http:www.google.com'
date: '123'
}]
}]
}
Ich versuche, einen Link in das ‚Links‘ Array zu drücken, die das Dokument eindeutig sein wird.
Meine erste Abfrage ...
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo'}}},
{upsert: true}
)
gibt mir diese (erstellt den Tag, wenn sie nicht existiert)
{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }
ich dann, dass mit dieser Abfrage folgen ...
db.userlinks.update (
{_id: 1, tags: {tag: 'foo', links: {$nin: [{link: 'http://www.google.com'}]}}},
{$push: {tags: {tag: 'foo', links: {link: 'http://www.google.com', date: '123'}}}},
{upsert: true}
)
Aber ich bekomme diese Fehlermeldung:
"Can not $ Push/$ pushAll Modifikator auf nicht-Array-Anwendung"Ich bin mir ziemlich sicher, dass das Problem in der 'Update' Komponente meiner zweiten Abfrage ist, aber ich bin mir nicht sicher, wie ich es beheben soll. Jede Hilfe wäre willkommen.
EDIT
Meine erste Frage ist jetzt ... (dank Joe)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
Meine zweite Frage ist jetzt ...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
, die erfolgreich den Link drückt in das Array 'Links', erlaubt jedoch auch Duplikate. Ich kann keine doppelten Links zulassen. $ addToSet Art von Arbeiten, jedoch wenn das Datum sich ändert, fügt es immer noch eine doppelte Verknüpfung ein.
Gibt es eine Möglichkeit, entweder die Existenz des Links im 'query' Teil meiner zweiten Abfrage zu überprüfen, oder stattdessen nur addToSet, wenn bestimmte Felder übereinstimmen?
können Sie nicht. Überlegen Sie, Ihr Schema zu ändern? –
Ich möchte nicht besonders mein Schema ändern, weil dies genau so modelliert ist, wie es ausgegeben wird, was bedeutet, dass ich keine Daten verwirren muss, sobald ich es aus der db herausgeholt habe. Ich dachte, das sollte der Hauptgrund sein, Mongodb tatsächlich zu benutzen? Die Fähigkeit, Ihre Objekte direkt in die Datenbank und aus dieser heraus zu modellieren. –