4 Stimmen

Wie kann man eine Abfrage in dieser verschachtelten Dokumentenstruktur (MongoDB) durchführen?

(Tut mir leid, wenn die Frage trivial ist.)

Ich habe Dokumente, die wie folgt aussehen (Python-Syntax):

{
  '_id': SomeObjectId,
  'features': [ 
                {'id': 'featureX' , 'value': 6},
                {'id': 'featureY', 'value': 45}
              ]
}

Mit dieser Struktur ist es einfach, alle Dokumente zu finden, die "featureX" in der Liste der Merkmale enthalten. Aber ich bin auch daran interessiert, den Wert im Unterdokument zu finden. Ich denke, in Python, wenn ich das Dokument mit einer Abfrage wie diese erhalten: db.articles.find({'features.id': 'featureX'}) dann müsste ich über das Array 'features' iterieren, um den richtigen 'Wert' herauszufinden.

Gibt es eine andere Art von Abfrage, die mir den interessanten Wert liefern kann (in diesem Fall muss ich nicht das gesamte Dokument abrufen, sondern nur den Teil mit {'id': 'featureX', 'value': 6}, der sich nicht an einem vorhersehbaren Indexwert im Array befinden wird.

PS: Ich denke, ich werde das Dokument anders gestalten, aber ich bin immer noch daran interessiert zu wissen, ob die obige Anfrage machbar ist.

Hier ist die neue Struktur:

{
'_id': SomeObjectId,
'features': { 
              'featureX': { 'someproperty':'aaa', 'value':6 }, 
              'featureY': {'someproperty' :'bbb', 'value':45} 
            }
}

Gibt es irgendwelche Probleme mit diesem Entwurf? In meinem Fall sind "featureX" und "featureY" eindeutig, so dass ihre Verwendung als Wörterbuchschlüssel kein Problem darstellt.

Bearbeiten: Ich muss klarstellen, dass ich atomar aktualisieren müssen sagen 'featureX' und 'featureY' in einem Dokument und MongoDB unterstützt keine Transaktionen . Auch der zweite Entwurf, der zwar nicht den Abruf eines Unterdokuments ermöglicht, sollte es einfach machen, die gewünschten Informationen im Client-Code schnell zu erhalten, vorausgesetzt, dass ich nach Unterdokumenten mit einem bestimmten Schlüssel suchen kann.

Ich denke, dass diese Abfrage die Aufgabe erfüllen sollte:

result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X