[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.당신은 가장 최근의 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.몽구스, 당신은 또한이 같은 우아한 .populate () 함수를 사용할 수 있습니다 :
몽구스, 당신은 또한이 같은 우아한 .populate () 함수를 사용할 수 있습니다 :
parents .find({}) .populate({ path: 'children', match: { age: { $gte: 18 }}, select: 'name age -_id' }) .exec()
-
==============================
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 }
(쿼리 주위에 배열 브래킷을 참고)
이 사람을 도움이되기를 바랍니다!
from https://stackoverflow.com/questions/16845191/mongoose-finding-subdocuments-by-criteria by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 삽입 시간 유성 모음을 정렬 할 수 있습니다? (0) | 2019.12.16 |
---|---|
[MONGODB] mongoimport를 사용하여 가져 오기 이상의 1 JSON 파일 (0) | 2019.12.16 |
[MONGODB] 분야별 MongoDB를 집계가 존재 (0) | 2019.12.16 |
[MONGODB] MongoDB를 : 업데이트 하위 문서 (0) | 2019.12.16 |
[MONGODB] MongoDB를 : 배열 필드가 요소가있는 경우에 방법을 알아 보려면? (0) | 2019.12.16 |