[MONGODB] MongoDB를, $ 조회로 집계 쿼리
MONGODBMongoDB를, $ 조회로 집계 쿼리
두 컬렉션, 태그 및 개인 얻었다.
태그 모델 :
{
en: String,
sv: String
}
사람 모델 :
{
name: String,
projects: [
title: String,
tags: [
{
type: Schema.ObjectId,
ref: 'tag'
}
]
]
}
나는 사람 모델에서 사용중인 모든 태그를 반환하는 쿼리를합니다. 모든 문서.
같은 뭔가
var query = mongoose.model('tag').find({...});
아니면 내가 어떻게 든이로 집계 방법을 사용 하는가?
해결법
-
==============================
1.특정 사용자 문서의 경우, 같은 채우기 () 함수를 사용할 수 있습니다
특정 사용자 문서의 경우, 같은 채우기 () 함수를 사용할 수 있습니다
var query = mongoose.model("person").find({ "name": "foo" }).populate("projects.tags");
당신은 예를 들어 'MongoDB를'또는 '노드 JS'어떤 태그가 어떤 사람을 검색하려면, 당신은 채우기 () 함수 과부하 등의 쿼리 옵션을 포함 할 수 있습니다 :
var query = mongoose.model("person").find({ "name": "foo" }).populate({ "path": "projects.tags", "match": { "en": { "$in": ["MongoDB", "Node JS"] } } });
모든 태그 모든 사람을위한 "project.tags"기존 싶은 경우에, 통합 프레임 워크는 길을 가야하는 것입니다. 사람의 컬렉션이 파이프 라인을 실행 고려하고 태그 컬렉션에 참가 왼쪽을하기 위해 $ 조회 연산자를 사용합니다 :
mongoose.model('person').aggregate([ { "$unwind": "$projects" }, { "$unwind": "$projects.tags" }, { "$lookup": { "from": "tags", "localField": "projects.tags", "foreignField": "_id", "as": "resultingTagsArray" } }, { "$unwind": "$resultingTagsArray" }, { "$group": { "_id": null, "allTags": { "$addToSet": "$resultingTagsArray" }, "count": { "$sum": 1 } } } ]).exec(function(err, results){ console.log(results); })
어떤 특정한 사람을 위해 다음 문서를 필터링 할 수있는 첫 번째 단계로 $ 일치하는 파이프 라인을 적용
mongoose.model('person').aggregate([ { "$match": { "name": "foo" } }, { "$unwind": "$projects" }, { "$unwind": "$projects.tags" }, { "$lookup": { "from": "tags", "localField": "projects.tags", "foreignField": "_id", "as": "resultingTagsArray" } }, { "$unwind": "$resultingTagsArray" }, { "$group": { "_id": null, "allTags": { "$addToSet": "$resultingTagsArray" }, "count": { "$sum": 1 } } } ]).exec(function(err, results){ console.log(results); })
당신이 MongoDB의 버전을 사용하는 경우 다른 해결 방법> = 2.6 <=은 $ 검색 연산자를 지원하지 않는 것은 같은 집계의 결과를 채우는 것입니다 3.0 :
mongoose.model('person').aggregate([ { "$unwind": "$projects" }, { "$unwind": "$projects.tags" }, { "$group": { "_id": null, "allTags": { "$addToSet": "$projects.tags" } } } ], function(err, result) { mongoose.model('person') .populate(result, { "path": "allTags" }, function(err, results) { if (err) throw err; console.log(JSON.stringify(results, undefined, 4 )); }); });
-
==============================
2.당신이 MongoDB의 버전 3.2을 사용하는 경우 다음은 왼쪽 외부 조인을 수행 $ 조회를 사용할 수 있습니다.
당신이 MongoDB의 버전 3.2을 사용하는 경우 다음은 왼쪽 외부 조인을 수행 $ 조회를 사용할 수 있습니다.
from https://stackoverflow.com/questions/39912017/mongodb-aggregate-query-with-lookup by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 +는 nodejs : ISODate 필드를 쿼리하는 방법? (0) | 2019.12.24 |
---|---|
[MONGODB] MongoDB를 사용하여 산화 마그네슘의 효율적인 페이징 (0) | 2019.12.23 |
[MONGODB] 몽구스 재귀 채우기 (0) | 2019.12.23 |
[MONGODB] 어레이 MongoDB의 형태 변화 (0) | 2019.12.23 |
[MONGODB] 몽고 개체를 사용하여 몽구스 빈 등의 설정 필드 (0) | 2019.12.23 |