공통 _id를 공유하는 두 개의 MongoDB 컬렉션이 있습니다. 몽고 셸을 사용하여 다른 컬렉션에 일치하는 _id가없는 모든 문서를 한 컬렉션에서 찾고 싶습니다.MongoDB 셸 쿼리에서 "컬렉션 b가 아닌 컬렉션 b의 데이터"가져 오기
예 : 나는 다양한 시도했습니다
{ "_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 }
지금 나는 _id 년대 Test2를에있는 모든 문서를 일치하지 않는 시험에 두 개의 문서를 반환 일부 쿼리 또는 쿼리를 원하는 $ not, $ ne, $ or, $ in의 조합은 올바른 조합과 구문을 얻을 수 없습니다. 또한, db.Test2.find({}, {"_id": 1})
이 먼저 실행되고 두 번째 쿼리에서 사용되는 변수에 저장 되어도 상관 없습니다 (그래도 작동하지는 않지만).
업데이트 : $ n을 가리키는 Zachary의 대답이 질문의 핵심 부분에 응답했습니다.
> db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"), ObjectId("4f08a766306b428fb9d8bb2f")]}})
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
하지만를 (이 인정하는 확장 성이 있지만,이 상황에서의 아닌 문제가 있기 때문에 어쨌든하려고하지 않습니다) 난 아직도 쉘 함께 두 개의 쿼리를 결합 할 수 없습니다 : 예를 들어,이 작동합니다. 이것은 분명히 이상적인보다 작은, 내가 얻을 수있는 가장 가까운 : 발스는 $ 닌에 배열 입력으로 직접 사용할 수 있도록 find 명령에 바로 값을 반환 할 수있는 방법이
vals = db.Test2.find({}, {"_id": 1}).toArray()
db.Test.find({"_id": {"$nin": [ObjectId(vals[0]._id), ObjectId(vals[1]._id)]}})
있습니까?
사소한 불만 사항 : 개념은 맞지만 답변에서 Test와 Test2를 거꾸로 가져 왔습니다. "이제는 _id가 Test2의 어떤 문서와도 일치하지 않는 Test의 두 문서를 반환하는 쿼리 또는 쿼리를 원합니다." –
'> db.Test.find ({ "_ id": { "$ nin": [ObjectId (" "ObjectId가 ("4f08a767306b428fb9d8bb30 "),"foo는 "3} {"_id "ObjectId가 ("4f08a769306b428fb9d8bb31 "); 4f08a75f306b428fb9d8bb2e") ObjectId가 ("4f08a766306b428fb9d8bb2f _id")]}})' 는 를 '{준다 " , "foo": 4}' –
감사합니다. 질문의 핵심 부분에 답변했지만, 두 번째 부분에도 응답하지 않으면 매우 유용하지 않습니다. 나는 그 질문을 반영하도록 수정했다. – Raman