Arbeiten mit Arrays als Werte in MongoDB

Im Gegensatz zu relationalen Datenbankmodellen können MongoDB-Dokumente Felder mit Werten als Arrays enthalten. Das prototypische Beispiel in fast allen MongoDB-Dokumentationen ist ein Dokument mit einem tagsFeld, dessen Wert ein Array von Zeichenfolgen ist, z ["NoSQL", "Ruby", "MongoDB"]. Wenn Sie aus einer relationalen Welt kommen (die die meisten von uns sind), ist diese Funktion auf den ersten Blick ein wenig einschüchternd.

Beispielsweise zielen die meisten Abfragen unabhängig von der zugrunde liegenden Datenstruktur (sei es eine relationale Tabelle, ein JSON-Dokument, ein Wörterbuch usw.) auf einen Wert und nicht auf den Schlüssel selbst. Wenn Sie das oben genannte Dokument verwenden, das ein tagsFeld mit einem Array als Wert enthält, ist das Abfragen des Schlüssels nicht sehr wertvoll. tagsAbfragen zielen auf die Werte eines Schlüssels ab. In diesem Fall werden die Fragen in Form von „Welche Dokumente enthalten das Tag X?“ Gestellt. Dies lässt sich leicht vorstellen, wenn der Wert singulär ist (dh select * from document where tag = X).

Wenn jedoch der Wert eines Schlüssels wie im obigen Fall pluralisiert wird, frage ich mich manchmal, wie eine Abfrage erstellt werden soll, wenn ich nur einen Teil der verfügbaren Werte kenne. Hier ist zum Beispiel ein einfaches Dokument mit zwei Feldern:

{a:"foo", b:[10,20,30]} 

In diesem Fall hat das Feld bein Array von Zahlen als Werte. Ich werde dieses Dokument zusammen mit einigen anderen einer synchronisierten Mongo-Sammlung hinzufügen foo_test.

> db.foo_test.save({a:"foo", b:[10,20,30]}) > db.foo_test.save({a:"foo", b:[15,25,35]}) > db.foo_test.save({a:"foo", b:[10,40,50]}) > db.foo_test.save({a:"bar", b:[10,60,70]}) 

Wenn diese Dokumente erstellt wurden, stellt sich die Frage, wie Sie alle Dokumente finden, deren bWerte eine 10 haben.

Weil es Mongos Tasche ist, Baby, stellt sich heraus, dass es mühelos einfach ist. Fragen Sie einfach nach dem Wert, als wäre er singulär!

> db.foo_test.find({"b":10}) { "_id" : ObjectId("4dd56bc747cc1d1360674d73"), "a" : "foo", "b" : [ 10, 20, 30 ] } { "_id" : ObjectId("4dd56be347cc1d1360674d75"), "a" : "foo", "b" : [ 10, 40, 50 ] } { "_id" : ObjectId("4dd56bee47cc1d1360674d76"), "a" : "bar", "b" : [ 10, 60, 70 ] } 

Was passiert , wenn man ein bisschen mehr wollen Finesse, wie die unterschiedlichen Werte zu finden , awo b10 den Wert? Genauso einfach, Baby.

> db.foo_test.distinct("a", {"b":10}) [ "bar", "foo" ] 

Eine Sache, die Sie beachten sollten: Sie können und sollten wahrscheinlich (wenn Sie vorhaben, viel nach Array-Werten zu suchen und es wird viele Dokumente geben) einen Index hinzufügen b. Dies kann zwar das Einfügen verlangsamen (da der Index jedes Mal aktualisiert werden muss), verbessert jedoch höchstwahrscheinlich die Lesevorgänge.

> db.foo_test.ensureIndex({b:1}) 

Arrays als Werte in einem MongoDB-Dokument sehen möglicherweise seltsam aus, wenn Sie überlegen, wie Sie sie abfragen sollen. Aber wie sich herausstellt, sind sie nicht so schlecht und man kann gegen sie vorgehen, als wären sie ein einziger Wert. Nicht schlecht, wenn du mich fragst.

Diese Geschichte "Arbeiten mit Arrays als Werte in MongoDB" wurde ursprünglich von JavaWorld veröffentlicht.