Yaygın bir _id paylaşan iki MongoDB koleksiyonum var. Mongo kabuğunu kullanarak, diğer koleksiyonda eşleşen bir belgeye sahip olmayan bir koleksiyondaki tüm belgeleri bulmak istiyorum.MongoDB kabuk sorgusunda "toplamada değil koleksiyondaki veriler" al
Örnek: Çeşitli denedim
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
:
> 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 }
Şimdi _ID en Test2 herhangi bir belge eşleşmeyen Testi iki dokümanları döndürür bazı sorgu satır istiyorum $ not, $ ne, $ veya $ in kombinasyonları ancak doğru kombinasyon ve sözdizimini alamıyor. Ayrıca, önce db.Test2.find({}, {"_id": 1})
'un çalıştırılmasının bir değişkene kaydedilip kaydedilmediğini umuyorum (ki bu da ikinci bir sorguda kullanılır).
Güncelleştirme: Zachary'ın $ nin işaret eden yanıtı, sorunun ana bölümünü yanıtladı.
> db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"), ObjectId("4f08a766306b428fb9d8bb2f")]}})
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
Ama (ve bu kabul ölçeklenebilir ama bu durumda onun değil bir sorun nedeniyle yine de çalışıyor değil) hala kabuğunda birlikte iki sorgu birleştiremezsiniz: Örneğin, bu çalışır. Bu tabii ki ideal olanın altındaysa, hangi alabilirim en yakın: vals $ Nin için dizi girişi olarak doğrudan kullanılabilir, böylece find komutu sadece değerler döndürmek için bir yol
vals = db.Test2.find({}, {"_id": 1}).toArray()
db.Test.find({"_id": {"$nin": [ObjectId(vals[0]._id), ObjectId(vals[1]._id)]}})
var mı?
Küçük şikayet: konsept doğru, fakat Test ve Test2'yi cevabınızda geriye doğru aldınız. "Şimdi, Test'teki herhangi bir belgenin Test2'deki herhangi bir belgeyle eşleşmediği iki belgeyi döndüren bazı sorgular veya sorgular istiyorum" –
"> db.Test.find ({" _ id ": {" $ nin ": [ObjectId (" ": Nesne ("4f08a767306b428fb9d8bb30 "), "fan": 3} { "_ID": Nesne (" 4f08a769306b428fb9d8bb31"); 4f08a75f306b428fb9d8bb2e "), Nesne Kimliği (" 4f08a766306b428fb9d8bb2f _ID")]}}) ' ' {verir" , "foo": 4} ' –
Teşekkürler, bu sorunun ana bölümünü yanıtladı, ancak bu ikinci kısmı da yanıtlamadan çok kullanışlı değil. Soruyu yansıtmak için güncelledim. – Raman