2013-07-17 7 views
6

Ich habe kürzlich begonnen, MongoDB für ein Projekt bei der Arbeit zu untersuchen. Ich bin ziemlich neu in der Abfragestruktur von JSON und MongoDB, also hoffe ich, dass einer von euch etwas Klärung bringen kann.Struktur und Abfragesyntax für rekursive Dokumente in MongoDB?

Ich habe das Problem in Excel-Terminologie übersetzt, da es üblich ist und meine Frage ziemlich gut darstellt.

Wenn ich versucht habe, eine Excel-Formel in ein MongoDB-Dokument zu modellieren, welches ist das beste Format dafür (ich erkläre meine möglichen Abfragen niedriger)? Denken Sie daran, dass Formeln in Excel in (fast) beliebiger Reihenfolge und mit beliebiger Tiefe verschachtelt werden können und Argumente in String- oder Zahlenform vorliegen können. Ich würde gerne in der Lage sein, über diese Zellen zu suchen, um solche Anfragen wie "Finde alle Zellen, die die Funktion = AVG()" oder "Finde alle Zellen, die die Funktion = SUM() enthalten innerhalb einer = AVG() - Funktion zu beantworten (wie = AVG (x, y, z, SUM (a, b, c))). In der Lage zu sein, diese auf einer Formelstruktur basierenden Abfragen zu beantworten, ist wichtiger als diejenigen, die auf Zahlen oder Strings antworten können, wenn die Beantwortung aller Fragen nicht möglich ist.

Derzeit bin Envisioning ich meine Dokumente in etwa dem folgenden Format:

{ 
    formula: "AVG", 
    arguments: [4,5, { 
     formula: "SUM", 
     arguments: [6,7,{ 
      formula: "ABS", 
      arguments: [-8,-9] 
(closing parenthesis/brackets) 
} 

Ist das eine angemessene Format für das, was ich suche zu tun? Wenn ja, wie würde ich nach "Finde Fälle mit = SUMME innerhalb von = AVG" fragen? Was ist mit der Suche nach der = ABS-Formel, die noch tiefer verschachtelt ist? Aufgrund der dynamischen Natur von Formeln ist es nicht wirklich möglich, eine bestimmte Ordnung oder bestimmte Tiefe zu erwarten.

+0

FYI, Sie können Dinge wie '= SUM 'und' = AVG' in Backticks (normalerweise auf den gleichen Schlüssel wie ~) setzen, da dies Code ist, der inline gehört. Willkommen bei StackOverflow! –

+0

@mohawkjohn Ich habe in der Tat über Inline-Code gelesen, ich halte Excel-Formeln nicht wirklich cool genug, um sexy Code-Formatierung zu verdienen. Wenn Sie denken, dass es anderen helfen würde, meine Frage zu verstehen, werde ich es ändern. –

+0

Ich würde nicht unbedingt denken, dass dies eine gute Passform für MongoDB angesichts der Beschreibung der Abfragen, die Sie vornehmen möchten. Es klingt eher so, als ob Sie eine Graphdatenbank in Betracht ziehen sollten, die komplexere Suchen nach "Kind/Vorfahren" -Typen ermöglicht. – WiredPrairie

Antwort

0

mit der Excel-Analogie Fortsetzung:

Zuerst die Sache zuerst entschieden, ich, dass auf der zweiten Ebene abfragen und über Kinder (dies ist nicht wirklich notwendig war, macht das Problem viel, viel einfacher). Diese Struktur kann sich nicht so leicht anpassen, also eine faire Warnung. Dies ist keine perfekte Antwort auf meine ursprüngliche Frage, sorry! Es scheint, dass MongoDB einfach nicht dazu geeignet ist, meine ursprüngliche Frage sehr einfach zu speichern.

Ich habe eine Struktur verwandt wie MongoDB Bäume darstellt. Anstatt zu versuchen, ein Excel-Dokument als ein MongoDB-Dokument darzustellen, wird es nun von vielen dargestellt (eines pro einmal verwendeter Formel und eines zum Speichern von Zeichenfolgen und Werten). Alle MongoDB-Dokumente, die sich auf dieselbe Excel-Arbeitsmappe beziehen, haben einfach eine Feldarbeitsmappe und speichern, zu welcher sie gehören.

Ein sehr einfaches Beispiel (die benutzerdefinierten _id-Tags sind nicht notwendig, aber sie sind leichter zu lesen):

{_id: book1_1 
workbook: book1, 
cell_values: [1,2,3], 
cell_strings: ['hello','world']} 

{_id:book1_2 
workbook: book1, 
formula: 'SUM', 
children: ['AVG','ABS']} 

{_id:book1_3 
workbook: book1, 
formula: 'AVG', 
children: ['SUM']} 

{_id:book1_4 
workbook: book1, 
formula: 'ABS', 
children: ['SUM']} 

Diese 4 MongoDB Dokumente stellen eine Excel-Dokument, das die folgende Formel Strukturen hat (dies ist nicht das Excel nur Blatt, das die oben MongoDB Dokumente erzeugen würde):

=SUM(AVG()) 
=AVG(SUM()) 
=ABS(SUM(ABS())) 

Zusammen mit den Werten 1,2,3 und Strings ‚hallo‘, ‚Welt‘ irgendwo im Innern.

Abfragen für ‚Hier finden Sie Bücher mit SUM Formel innerhalb von AVG Formel‘ ist dann die folgende Abfrage:

db.collection.find({$and: [{formula: 'AVG'},{children: 'SUM'}]}) 

gibt das _id:book1_3 MongoDB Dokument. Sie können die Arbeitsmappe dann wie gewünscht entfernen.