Tôi có hai bộ sưu tập MongoDB chia sẻ một _id chung. Sử dụng vỏ mongo, tôi muốn tìm tất cả các tài liệu trong một bộ sưu tập không có _id phù hợp trong bộ sưu tập khác.Lấy "dữ liệu từ bộ sưu tập b không có trong bộ sưu tập" trong truy vấn shell MongoDB
Ví dụ:
> 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 }
Bây giờ tôi muốn có một số thắc mắc hoặc các truy vấn mà trả về hai tài liệu trong thử nghiệm nơi của _id không phù hợp với bất kỳ tài liệu trong Test2:
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
Tôi đã thử khác nhau các kết hợp $ not, $ ne, $ hoặc, $ in nhưng không thể có được kết hợp và cú pháp đúng. Ngoài ra, tôi không quan tâm nếu db.Test2.find({}, {"_id": 1})
được thực hiện trước tiên, được lưu vào một số biến, sau đó được sử dụng trong truy vấn thứ hai (mặc dù tôi không thể làm điều đó để hoạt động).
Cập nhật: Câu trả lời của Zachary trỏ tới $ nin đã trả lời phần quan trọng của câu hỏi. Ví dụ, công trình này:
> db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"), ObjectId("4f08a766306b428fb9d8bb2f")]}})
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
Nhưng (và thừa nhận đây không phải là khả năng mở rộng nhưng cố gắng để nó anyway vì nó không phải là một vấn đề trong tình huống này) tôi vẫn không thể kết hợp hai truy vấn với nhau trong vỏ. Đây là cảm giác mà tôi có thể nhận được, mà rõ ràng là ít hơn lý tưởng:
vals = db.Test2.find({}, {"_id": 1}).toArray()
db.Test.find({"_id": {"$nin": [ObjectId(vals[0]._id), ObjectId(vals[1]._id)]}})
Có cách nào để trở lại chỉ các giá trị trong lệnh find để Vals có thể được sử dụng trực tiếp như các mảng đầu vào đến $ nin?
Khiếu nại nhỏ: khái niệm là đúng, nhưng bạn đã nhận được Test và Test2 ngược trong câu trả lời. "Bây giờ tôi muốn một số truy vấn hoặc truy vấn trả về hai tài liệu trong Kiểm tra trong đó _id không khớp với bất kỳ tài liệu nào trong Test2" –
'> db.Test.find ({" _ id ": {" $ nin ": [ObjectId (" 4f08a75f306b428fb9d8bb2e "), ObjectId (" 4f08a766306b428fb9d8bb2f ")]}});' cho '{ "_id": ObjectId (" 4f08a767306b428fb9d8bb30 "), "foo": 3} { "_id": ObjectId (" 4f08a769306b428fb9d8bb31") , "foo": 4} ' –
Cảm ơn, đã trả lời phần quan trọng của câu hỏi, nhưng điều này không hữu ích lắm mà không trả lời phần thứ hai. Tôi đã cập nhật câu hỏi để phản ánh. – Raman