MongoDB 셸 쿼리에서 "수집에서 데이터 b가 수집 a에 있지 않음"을 가져옵니다.
공통 _id를 공유하는 두 개의 MongoDB 컬렉션이 있습니다.mongo 쉘을 사용하여 한 컬렉션에서 일치하는 _id가 없는 모든 문서를 다른 컬렉션에서 찾고 싶습니다.
예:
> 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가 테스트2의 어떤 문서와도 일치하지 않는 테스트의 두 문서를 반환하는 쿼리를 몇 개 원합니다.
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
저는 $not, $ne, $or, $in의 다양한 조합을 시도해 보았지만 올바른 조합과 구문을 얻을 수 없었습니다.또한, 저는 상관없습니다.db.Test2.find({}, {"_id": 1})
먼저 실행되고 일부 변수에 저장된 다음 두 번째 쿼리에 사용됩니다(그것도 작동하지는 않지만).
업데이트: $nin을 가리키는 Zachary의 대답은 질문의 핵심 부분에 답했습니다.예를 들어, 다음과 같이 작동합니다.
> db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"), ObjectId("4f08a766306b428fb9d8bb2f")]}})
{ "_id" : ObjectId("4f08a767306b428fb9d8bb30"), "foo" : 3 }
{ "_id" : ObjectId("4f08a769306b428fb9d8bb31"), "foo" : 4 }
하지만 (이 상황에서는 문제가 되지 않기 때문에 확장성이 없다는 것을 인정하지만 어쨌든 시도해 봅니다.) 저는 여전히 셸에서 두 쿼리를 함께 결합할 수 없습니다.이것이 제가 얻을 수 있는 가장 가까운 것입니다. 이것은 분명히 이상적이지 않습니다.
vals = db.Test2.find({}, {"_id": 1}).toArray()
db.Test.find({"_id": {"$nin": [ObjectId(vals[0]._id), ObjectId(vals[1]._id)]}})
$nin에 대한 배열 입력으로 직접 val을 사용할 수 있도록 find 명령의 값만 반환하는 방법이 있습니까?
mongo 3.2에서는 다음 코드가 작동하는 것 같습니다.
db.collectionb.aggregate([
{
$lookup: {
from: "collectiona",
localField: "collectionb_fk",
foreignField: "collectiona_fk",
as: "matched_docs"
}
},
{
$match: {
"matched_docs": { $eq: [] }
}
}
]);
이 https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ # use-flash-with-an-array 예제를 기반으로 합니다.
후속 조치에 응답합니다.저는 지도()를 사용합니다.
이 경우:
> b1 = {i: 1}
> db.b.save(b1)
> db.b.save({i: 2})
> db.a.save({_id: b1._id})
필요한 것은 다음과 같습니다.
> vals = db.a.find({}, {id: 1}).map(function(a){return a._id;})
> db.b.find({_id: {$nin: vals}})
어느 쪽이 돌아옵니까?
{ "_id" : ObjectId("4f08c60d6b5e49fa3f6b46c1"), "i" : 2 }
_ids를 컬렉션 B에서 다시 끌어오지 않으려면 컬렉션 A에서 저장해야 하지만 다음을 사용하여 실행할 수 있습니다.$nin
모든 MongoDB 연산자에 대한 고급 쿼리를 참조하십시오.
제공한 예제를 사용하는 엔드 쿼리는 다음과 같습니다.
db.Test.find({"_id": {"$nin": [ObjectId("4f08a75f306b428fb9d8bb2e"),
ObjectId("4f08a766306b428fb9d8bb2f")]}})`
이 접근 방식은 확장되지 않습니다.확장 가능한 솔루션이 필요한 경우 컬렉션 A와 B에서 _id가 다른 컬렉션에 있는지 여부를 나타내는 플래그를 설정한 다음 대신 쿼리를 실행해야 합니다.
두 번째 파트에 대해 업데이트됨:
두 번째 부분은 불가능합니다.MongoDB는 단일 쿼리에서 컬렉션 간 조인 또는 교차 쿼리를 지원하지 않습니다.한 컬렉션에서 쿼리하고 결과를 저장한 다음 두 번째 컬렉션에서 쿼리하는 것은 앞서 언급한 대로 데이터를 행 자체에 포함시키지 않는 한 유일한 선택입니다.
첫 번째 컬렉션에 나타나는 두 번째 컬렉션의 모든 문서를 표시하는 스크립트를 만들었습니다.그런 다음 두 번째 수집 문서를 처리했습니다.
var first = db.firstCollection.aggregate([ {'$unwind':'$secondCollectionField'} ])
while (first.hasNext()){ var doc = first.next(); db.secondCollection.update( {_id:doc.secondCollectionField} ,{$set:{firstCollectionField:doc._id}} ); }
...표시가 없는 두 번째 컬렉션을 처리합니다.
db.secondCollection.find({"firstCollectionField":{$exists:false}})
언급URL : https://stackoverflow.com/questions/8772936/get-data-from-collection-b-not-in-collection-a-in-a-mongodb-shell-query
'sourcecode' 카테고리의 다른 글
이클립스의 아이콘은 무엇을 의미합니까? (0) | 2023.05.04 |
---|---|
--depth 1로 얕은 복제를 하고, 커밋을 만들고, 업데이트를 다시 가져오는 것이 안전합니까? (0) | 2023.05.04 |
배치 파일에서 기다리지 않고 응용 프로그램을 시작하는 방법은 무엇입니까? (0) | 2023.04.29 |
Pymongo의 빠른 또는 대량 업스타트 (0) | 2023.04.29 |
애플리케이션 통찰력 확보 또는 로그 분석 (0) | 2023.04.29 |