Supposto che disponga di due raccolte, A
e B
.Ottenere la differenza di due raccolte strutturate in modo diverso
A
contiene documenti semplici della forma seguente:
{ _id: '...', value: 'A', data: '...' }
{ _id: '...', value: 'B', data: '...' }
{ _id: '...', value: 'C', data: '...' }
…
B
contiene oggetti nidificati come questo:
{ _id: '...', values: [ 'A', 'B' ]}
{ _id: '...', values: [ 'C' ]}
…
Ora ciò che può accadere è che ci sono documenti in A
che non fanno riferimento qualsiasi documento in B
o che ci siano documenti di riferimento in B
che non sono presenti in A
.
Chiamiamoli "orfani".
La mia domanda ora è: come trovo quei documenti orfani, in un modo più efficiente? Alla fine, quello di cui ho bisogno è il loro campo _id
.
Finora ho usato unwind
a "appiattire" A
, e calcolato la differenza con il differenceWith
function of Ramda, ma questo richiede molto tempo ed è di sicuro non è realmente efficace, come faccio io tutto il lavoro sul client invece che nel database.
Ho visto che c'è un operatore $setDifference
in MongoDB, ma non l'ho fatto funzionare.
Qualcuno può indicarmi la giusta direzione, come risolvere questi problemi utilizzando Node.js e eseguire la maggior parte (tutti?) Del lavoro nel database? Ogni suggerimento è apprezzato :-)
'Provalo al comando:' var myCursor = db.B.find(); var B = myCursor.hasNext()? myCursor.next(): null; db.A.find ({valore: {$ nin: B.valori}}); Speriamo che questo aiuti – karthick
@ karthick.k Basta postare la mia risposta lunga e dettagliata! La tua soluzione sembra molto meglio! Lascio il mio dentro, dal momento che mostra come farlo con la pipeline di aggregazione ... – cessor
@cessor Diverse idee e soluzioni sono sempre buone :) – karthick