복붙노트

[MONGODB] MongoDB를, $ 조회로 집계 쿼리

MONGODB

MongoDB를, $ 조회로 집계 쿼리

두 컬렉션, 태그 및 개인 얻었다.

태그 모델 :

{
  en: String,
  sv: String
}

사람 모델 :

{
  name: String,
  projects: [
    title: String,
    tags: [
      {
        type: Schema.ObjectId,
        ref: 'tag'
      }
    ]
  ]

}

나는 사람 모델에서 사용중인 모든 태그를 반환하는 쿼리를합니다. 모든 문서.

같은 뭔가

var query = mongoose.model('tag').find({...});

아니면 내가 어떻게 든이로 집계 방법을 사용 하는가?

해결법

  1. ==============================

    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. ==============================

    2.당신이 MongoDB의 버전 3.2을 사용하는 경우 다음은 왼쪽 외부 조인을 수행 $ 조회를 사용할 수 있습니다.

    당신이 MongoDB의 버전 3.2을 사용하는 경우 다음은 왼쪽 외부 조인을 수행 $ 조회를 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/39912017/mongodb-aggregate-query-with-lookup by cc-by-sa and MIT license