Ho due raccolte MongoDB che condividono un _id comune. Usando la shell mongo, voglio trovare tutti i documenti in una collezione che non hanno un _id corrispondente nell'altra collezione.Ottieni "i dati dalla raccolta b non nella raccolta a" in una query della shell MongoDB
Esempio:
> db.Test.insert({ "_id" : ObjectId("4f08a75f306b428fb9d8bb2e"), "foo" : 1 })
> db.Test.insert({ "_id" : ObjectId("4f08a766306b428fb9d8bb2f"), "foo" : 2 })
> db.Test.insert({ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 })
> db.Test.insert({ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 })
> db.Test.find()
{ "_id" : ObjectId("4f08a75f306b428fb9d8bb2e"), "foo" : 1 }
{ "_id" : ObjectId("4f08a766306b428fb9d8bb2f"), "foo" : 2 }
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
> db.Test2.insert({ "_id" : ObjectId("4f08a75f306b428fb9d8bb2e"), "bar" : 1 });
> db.Test2.insert({ "_id" : ObjectId("4f08a766306b428fb9d8bb2f"), "bar" : 2 });
> db.Test2.find()
{ "_id" : ObjectId("4f08a75f306b428fb9d8bb2e"), "bar" : 1 }
{ "_id" : ObjectId("4f08a766306b428fb9d8bb2f"), "bar" : 2 }
Ora voglio un po 'di query o le query che restituisce i due documenti di prova dove i _id di non corrispondono qualsiasi documento in Test2:
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
Ho provato varie combinazioni di $ not, $ ne, $ o, $ in ma non riescono a ottenere la combinazione e la sintassi giuste. Inoltre, non mi interessa se prima viene eseguito db.Test2.find({}, {"_id": 1})
, salvato in una variabile, che viene poi utilizzata in una seconda query (anche se non riesco a farlo funzionare).
Aggiornamento: la risposta di Zachary che indicava $ nin ha risposto alla parte fondamentale della domanda. Ad esempio, questo funziona:
> db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"), ObjectId("4f08a766306b428fb9d8bb2f")]}})
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
Ma (e riconoscendo questo non è scalabile, ma cercando di comunque perché il suo non è un problema in questa situazione) non riesco ancora a combinare le due interrogazioni insieme nel guscio. Questo è il più vicino che posso ottenere, che è ovviamente meno ideale:
vals = db.Test2.find({}, {"_id": 1}).toArray()
db.Test.find({"_id": {"$nin": [ObjectId(vals[0]._id), ObjectId(vals[1]._id)]}})
C'è un modo per restituire solo i valori nel comando find in modo che vals possono essere utilizzati direttamente come ingresso array per $ nin?
Minor reclamo: il concetto è giusto, ma hai ottenuto il Test e il Test2 all'indietro nella risposta. "Ora desidero alcune query o query che restituiscano i due documenti in Test in cui _id non corrisponde a nessun documento in Test2" –
'> db.Test.find ({" _ id ": {" $ nin ": [ObjectId (" 4f08a75f306b428fb9d8bb2e "), ObjectId (" 4f08a766306b428fb9d8bb2f ")]}});' dà '{ "_id": ObjectId (" 4f08a767306b428fb9d8bb30 "), "foo": 3} { "_id": ObjectId (" 4f08a769306b428fb9d8bb31") , "foo": 4} ' –
Grazie, ha risposto alla parte fondamentale della domanda, ma questo non è molto utile senza rispondere anche alla seconda parte. Ho aggiornato la domanda per riflettere. – Raman