반응형
$빈 배열 찾기
각 문서의 구조가 다음과 같은 사용자 모음이 있습니다.
{
"_id": "<id>",
"login": "xxx",
"solved": [
{
"problem": "<problemID>",
"points": 10
},
...
]
}
필드solved
비어 있거나 임의의 많은 하위 문서를 포함할 수 있습니다.제 목표는 사용자 목록과 총 점수(합계)를 함께 얻는 것입니다.points
)에서 아직 문제를 해결하지 못한 사용자에게는 총 0점이 할당됩니다.단일 쿼리(이상적으로 집계 프레임워크 사용)로 이 작업을 수행할 수 있습니까?
집계 프레임워크에서 다음 쿼리를 사용하려고 했습니다.
{ "$group": {
"_id": "$_id",
"login": { "$first": "$login" },
"solved": { "$addToSet": { "points": 0 } }
} }
{ "$unwind": "$solved" }
{ "$group": {
"_id": "$_id",
"login": { "$first": "$login" },
"solved": { "$sum": "$solved.points" }
} }
그러나 다음과 같은 오류가 발생합니다.
exception: The top-level _id field is the only field currently supported for exclusion
잘 부탁드립니다.
MongoDB 3.2 버전 이상에서는 운영자에게 몇 가지 옵션이 제공됩니다.preserveNullAndEmptyArrays
옵션이 이 문제를 해결할 것입니다.
이 옵션이 true로 설정되어 있고 경로가 null, 누락 또는 빈 배열인 경우 문서를 출력합니다.거짓인 경우 경로가 null이거나 누락되었거나 배열이 비어 있으면 문서를 출력하지 않습니다.이 경우 true로 설정합니다.
db.collection.aggregate([
{ "$unwind": {
"path": "$solved",
"preserveNullAndEmptyArrays": true
} },
{ "$group": {
"_id": "$_id",
"login": { "$first": "$login" },
"solved": { "$sum": "$solved.points" }
} }
])
해결 방법은 다음과 같습니다. "해결된" 필드가 없거나 null과 같거나 일련의 문제와 점수가 해결된 것으로 가정합니다.처리할 수 없는 경우는 빈 배열로 "해결"됩니다. 이는 간단한 추가 조정이 될 수 있습니다.
project = {$project : {
"s" : {
"$ifNull" : [
"$solved",
[
{
"points" : 0
}
]
]
},
"login" : 1
}
};
unwind={$unwind:"$s"};
group= { "$group" : {
"_id" : "$_id",
"login" : {
"$first" : "$login"
},
"score" : {
"$sum" : "$s.points"
}
}
}
db.students.aggregate( [ project, unwind, group ] );
$165, $swind 내부 조회 어레이는 비어 있을 수 있습니다.
let posts = await Post.aggregate<ActivityDoc>([
{
$match: {
_id: new mongoose.Types.ObjectId(req.params.id),
},
},
{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user',
},
},
{
$unwind: '$user',
},
{
$unwind: {
path: '$user.follower',
preserveNullAndEmptyArrays: true,
},
},
{
$match: {
$or: [
{
$and: [
{
'privacy.mode': {
$eq: PrivacyMode.EveryOne,
},
},
],
},
{
$and: [
{
'privacy.mode': {
$eq: PrivacyMode.MyCircle,
},
},
{
'user.follower.id': {
$eq: req.currentUser?.id,
},
},
],
},
],
},
},
]);
언급URL : https://stackoverflow.com/questions/13895006/unwind-empty-array
반응형
'source' 카테고리의 다른 글
결과를 제한하기 전에 Mongo에게 컬렉션을 정렬하라고 어떻게 말합니까? (0) | 2023.05.22 |
---|---|
스팸으로 거부되는 그리드 전자 메일 보내기 (0) | 2023.05.22 |
Meteor - collection.find()는 항상 모든 필드를 반환합니다. (0) | 2023.05.22 |
mongodb에 그래프 저장 (0) | 2023.05.22 |
업데이트를 사용하여 여러 필드를 어떻게 업데이트합니까?공식 c# 드라이버를 사용하여 MongoDB에서 설정합니까? (0) | 2023.05.22 |