복붙노트

[MONGODB] 몽구스 - 기준으로 하위 문서를 찾는

MONGODB

몽구스 - 기준으로 하위 문서를 찾는

난 그냥이 문제와 붙어있어. 나는 두 몽구스 스키마를 가지고 :

var childrenSchema = mongoose.Schema({
    name: {
        type: String
    },
    age: {
        type: Number,
        min: 0
    }
});

var parentSchema = mongoose.Schema({
    name : {
        type: String
    },
    children: [childrenSchema]
});

질문은 어떻게 모든 부모 문서에서 모든 하위 문서 (이 경우, childrenSchema 객체)를 가져 오기 위해, 무엇입니까? 의 난 일부 데이터가 있다고 가정하자 :

var parents = [
    { name: "John Smith",
    children: [
        { name: "Peter", age: 2 }, { name: "Margaret", age: 20 }
    ]},
    { name: "Another Smith",
    children: [
        { name: "Martha", age: 10 }, { name: "John", age: 22 }
    ]}
];

18.이 가능 나이보다 모든 어린이 - 단일 쿼리에 - 나는 검색 하시겠습니까? 모든 대답은, 감사를 이해할 수있을 것이다!

해결법

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

    1.당신은 가장 최근의 MongoDB의 버전에서 쿼리 프로젝션 연산자로 elemMatch $를 사용할 수 있습니다. 몽고 쉘에서 :

    당신은 가장 최근의 MongoDB의 버전에서 쿼리 프로젝션 연산자로 elemMatch $를 사용할 수 있습니다. 몽고 쉘에서 :

    db.parents.find(
        {'children.age': {$gte: 18}},
        {children:{$elemMatch:{age: {$gte: 18}}}})
    

    이 아이들의 배열 중 어린 아이들의 문서를 필터링 :

    { "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
    { "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }
    

    당신이 볼 수 있듯이, 아이들은 여전히 ​​부모 문서 내부에 그룹화됩니다. MongoDB를이 컬렉션에서 반환 문서를 쿼리합니다. 당신은 별도의 문서로 분할 집계 프레임 워크의 $ 언 와인드 방법을 사용할 수 있습니다 :

    > db.parents.aggregate({
        $match: {'children.age': {$gte: 18}}
    }, {
        $unwind: '$children'
    }, {
        $match: {'children.age': {$gte: 18}}
    }, {
        $project: {
            name: '$children.name',
            age:'$children.age'
        }
    })
    {
        "result" : [
            {
                "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
                "name" : "Margaret",
                "age" : 20
            },
            {
                "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
                "name" : "John",
                "age" : 22
            }
        ],
        "ok" : 1
    }
    

    나는 성능을 위해 $ 일치 절을 반복하십시오 $ 긴장을 풀고 유용 문서를 고려, 그래서 그것을 통해 처음으로, 적어도 18 세 자식이 부모를 제거합니다. 두 번째 $ 일치는 $ 언 와인드 일치하지 않는 출력과 최고 수준 하위 문서에서 $ 프로젝트 호이스트 어린이의 정보를 제거합니다.

  2. ==============================

    2.몽구스, 당신은 또한이 같은 우아한 .populate () 함수를 사용할 수 있습니다 :

    몽구스, 당신은 또한이 같은 우아한 .populate () 함수를 사용할 수 있습니다 :

    parents
    .find({})
    .populate({
      path: 'children',
      match: { age: { $gte: 18 }},
      select: 'name age -_id'
    })
    .exec()
    
  3. ==============================

    3.그러나 몽구스 (몽구스 5.x)은 이후 버전의 매력처럼 A. 제시 Jiryu 데이비스의 응답 작품, 우리는 오류가 발생합니다 :

    그러나 몽구스 (몽구스 5.x)은 이후 버전의 매력처럼 A. 제시 Jiryu 데이비스의 응답 작품, 우리는 오류가 발생합니다 :

    Model.aggregate에 사업자의 확산을 통과 5.x의 것을 허용하지를 몽구스 (). 대신 Model.aggregate ({$ 매치}, {$ 건너}), Model.aggregate을의 ([{$ 일치}, {$ 건너}])

    그래서에게 코드는 단순히 지금과 같다 :

    > db.parents.aggregate([{
        $match: {'children.age': {$gte: 18}}
    }, {
        $unwind: '$children'
    }, {
        $match: {'children.age': {$gte: 18}}
    }, {
        $project: {
            name: '$children.name',
            age:'$children.age'
        }
    }])
    {
        "result" : [
            {
                "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
                "name" : "Margaret",
                "age" : 20
            },
            {
                "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
                "name" : "John",
                "age" : 22
            }
        ],
        "ok" : 1
    }
    

    (쿼리 주위에 배열 브래킷을 참고)

    이 사람을 도움이되기를 바랍니다!

  4. from https://stackoverflow.com/questions/16845191/mongoose-finding-subdocuments-by-criteria by cc-by-sa and MIT license