MongoDB가 배열 요소로 기본 투영을 처리하는 방법입니다. 이 같은 것을 할 수 있지만 :
Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {
})
을 그리고 그냥 조건과 일치하는 모든 문서는 물론 모든 배열 요소에 대한 코멘트 배열의 하위 문서 내에서 "upvotes"필드를 반환 당신은 할 수 없습니다 이것을 positional $
연산자를 사용하여 선택된 위치 투영과 결합하십시오. 이것은 기본적으로 "이론"에서 유래합니다. 일반적으로 실제로 배열 전체를 반환하려고합니다. 따라서 이것이 항상 효과가 있었고 곧 바뀔 것 같지 않습니다.
원하는 것을 얻으려면 aggregation framework에서 제공하는 문서 조작을위한 확장 기능이 필요합니다. 2.6 이후 MongoDB에의
Model.aggregate(
[
// Match the document containing the array element
{ "$match": { "comments._id" : oid } },
// Unwind to "de-normalize" the array content
{ "$unwind": "$comments" },
// Match the specific array element
{ "$match": { "comments._id" : oid } },
// Group back and just return the "upvotes" field
{ "$group": {
"_id": "$_id",
"comments": { "$push": { "upvotes": "$comments.upvotes" } }
}}
],
function(err,docs) {
}
);
또는 현대적인 버전 당신도이 작업을 수행 할 수 있습니다 :
Model.aggregate(
[
{ "$match": { "comments._id" : oid } },
{ "$project": {
"comments": {
"$setDifference": [
{ "$map": {
"input": "$comments",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el._id", oid ] },
{ "upvotes": "$$el.upvotes" },
false
]
}
}},
[false]
]
}}
}}
],
function(err,docs) {
}
)
을 그리고 그 수행 할 $map
및 $setDifference
연산자를 사용 이렇게하면 문서를 반환하는 방법을 세밀하게 제어 할 수 $unwind
스테이지를 먼저 처리하지 않고 배열 내용을 "인라인"필터링합니다.
문서가 반환되는 방식을보다 잘 제어하려면 포함 된 문서로 작업 할 때 집계 프레임 워크가이를 수행하는 방법입니다.
재미있을 것 같습니다. 감사 – Vinz243