2013-07-17 13 views
6

Ho recentemente iniziato a cercare MongoDB per un progetto al lavoro. Sono abbastanza nuovo per la struttura delle query di JSON e MongoDB, quindi spero che qualcuno di voi possa fornire alcuni chiarimenti.Sintassi della struttura e della query per i documenti ricorsivi in ​​MongoDB?

Ho tradotto il problema nella terminologia di Excel poiché è comune e rappresenta la mia domanda abbastanza bene.

Se stavo tentando di modellare una formula di Excel in un documento MongoDB, qual è il formato migliore per farlo (Spiegherò le mie potenziali domande più in basso)? Tieni presente che le formule in Excel possono essere annidate in (quasi) qualsiasi ordine e con qualsiasi profondità e gli argomenti possono venire sia in forma stringa che in forma numerica. Mi piacerebbe essere in grado di cercare tra queste celle per rispondere a domande come "Trova tutte le celle che utilizzano la funzione = AVG()" o "Trova tutte le celle che contengono la funzione = SUM() all'interno di una funzione = AVG() (come = AVG (x, y, z, SUM (a, b, c))). " Essere in grado di rispondere a queste domande basate su una struttura basata su una formula è più importante che essere in grado di rispondere ai numeri o alle stringhe se non è possibile rispondere a tutti.

Attualmente mi sto immaginando i miei documenti avendo più o meno il seguente formato:

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

È che un formato ragionevole per quello che sto cercando di fare? Se lo è, come posso richiedere "Trova casi con = SUM dentro = AVG"? Che ne dici di trovare la formula = ABS che è nidificata ancora più in profondità? A causa della natura dinamica delle formule, non è davvero possibile aspettarsi un certo ordine o una certa profondità.

+0

FYI, puoi mettere cose come '= SUM' e' = AVG' all'interno di backtick (di solito sulla stessa chiave di ~) poiché si tratta di codice che appartiene inline. Benvenuto in StackOverflow! –

+0

@mohawkjohn Ho davvero letto sul codice inline, non considero le formule di Excel abbastanza interessanti da meritare la formattazione del codice sexy. Se pensi che aiuterebbe gli altri a capire la mia domanda, la cambierò comunque. –

+0

Non penserei necessariamente che questo sia adatto per MongoDB dato la descrizione delle query che si desidera effettuare. Sembra più che si possa prendere in considerazione un database grafico che consenta ricerche di tipo "figlio/antenato" più complesse. – WiredPrairie

risposta

0

Continuando con l'analogia di Excel:

prima cosa di prima, ho deciso che l'interrogazione sul secondo livello e al di là di bambini non era davvero necessario (questo rende il problema molto, molto più semplice). Questa struttura non può adattarsi facilmente a questo, quindi un avvertimento equo. Questa non è la risposta perfetta alla mia domanda iniziale, scusa! Sembra che MongoDB non sia adatto per memorizzare la mia domanda originale molto facilmente.

Ho usato una struttura simile a come MongoDB consiglia di rappresentare alberi. Invece di provare a rappresentare un documento Excel come un documento MongoDB, è ora rappresentato da molti (uno per formula unica utilizzata e uno per memorizzare stringhe e valori). Tutti i documenti MongoDB relativi alla stessa cartella di lavoro Excel hanno semplicemente una cartella di lavoro sul campo e memorizzano a quale appartengono.

Un esempio molto semplice (i tag personalizzati _id non sono necessari, ma sono più facili da leggere):

{_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']} 

Questi 4 documenti MongoDB rappresentano un documento Excel che ha le seguenti strutture formula (questo non è l'unico foglio di excel che produrrebbe i documenti di cui sopra MongoDB):

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

Insieme con i valori 1,2,3 e stringhe 'ciao', 'mondo' da qualche parte dentro di esso.

Interrogazione per 'trovare i libri con somma formula all'interno di AVG formula' è quindi la seguente query:

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

restituisce il documento _id:book1_3 MongoDB. Puoi quindi rimuovere la cartella di lavoro da quella che desideri.

Problemi correlati