반응형
Mongodb - 조건부인 경우 집계 $push
나는 문서 묶음을 집계하려고 합니다.제가 $push하고 싶은 서류에는 두 개의 필드가 있습니다.그러나 "_id" 및 "A" 필드라고 가정하고, "A"가 $gt 0이면 $push "_id" 및 "A"만 원합니다.
저는 두 가지 접근법을 시도했습니다.
첫 번째.
db.collection.aggregate([{
"$group":{
"field": {
"$push": {
"$cond":[
{"$gt":["$A", 0]},
{"id": "$_id", "A":"$A"},
null
]
}
},
"secondField":{"$push":"$B"}
}])
하지만 이렇게 하면 null 값이 "필드"로 푸시되므로 필요하지 않습니다.
두 번째.
db.collection.aggregate([{
"$group":
"field": {
"$cond":[
{"$gt",["$A", 0]},
{"$push": {"id":"$_id", "A":"$A"}},
null
]
},
"secondField":{"$push":"$B"}
}])
두 번째 방법은 전혀 효과가 없습니다.
다른 경우에 $push를 건너뛸 수 있는 방법이 있습니까?
추가됨:
예상 문서:
{
"_id":objectid(1),
"A":2,
"B":"One"
},
{
"_id":objectid(2),
"A":3,
"B":"Two"
},
{
"_id":objectid(3),
"B":"Three"
}
예상 출력:
{
"field":[
{
"A":"2",
"_id":objectid(1)
},
{
"A":"3",
"_id":objectid(2)
},
],
"secondField":["One", "Two", "Three"]
}
사용할 수 있습니다."$$REMOVE"
:
- 이 시스템 변수는 버전 3.6(mongodb 문서)에 추가되었습니다.
db.collection.aggregate([{
$group:{
field: {
$push: {
$cond:[
{ $gt: ["$A", 0] },
{ id: "$_id", A:"$A" },
"$$REMOVE"
]
}
},
secondField:{ $push: "$B" }
}
])
이러한 방식으로 null을 필터링할 필요가 없습니다.
@Beeram이 제안한 게시물을 읽고 질문에 대한 답변입니다.
db.collection.aggregate([{
"$group":{
"field": {
"$push": {
"$cond":[
{"$gt":["$A", 0]},
{"id": "$_id", "A":"$A"},
null
]
}
},
"secondField":{"$push":"$B"}
},
{
"$project": {
"A":{"$setDifference":["$A", [null]]},
"B":"$B"
}
}])
또 다른 옵션은 $filter 연산자를 사용하는 것입니다.
db.collection.aggregate([
{
$group : {
_id: null,
field: { $push: { id: "$_id", A : "$A"}},
secondField:{ $push: "$B" }
}
},
{
$project: {
field: {
$filter: {
input: "$field",
as: "item",
cond: { $gt: [ "$$item.A", 0 ] }
}
},
secondField: "$secondField"
}
}])
첫 번째 단계에서는 어레이를 결합하고 두 번째 단계에서는 필터링합니다.
$group: {
_id: '$_id',
tasks: {
$addToSet: {
$cond: {
if: {
$eq: [
{
$ifNull: ['$tasks.id', ''],
},
'',
],
},
then: '$$REMOVE',
else: {
id: '$tasks.id',
description: '$tasks.description',
assignee: {
$cond: {
if: {
$eq: [
{
$ifNull: ['$tasks.assignee._id', ''],
},
'',
],
},
then: undefined,
else: {
id: '$tasks.assignee._id',
name: '$tasks.assignee.name',
thumbnail: '$tasks.assignee.thumbnail',
status: '$tasks.assignee.status',
},
},
},
},
},
},
},
}
언급URL : https://stackoverflow.com/questions/49687020/mongodb-aggregation-push-if-conditional
반응형
'bestsource' 카테고리의 다른 글
jQuery에서 속성 추가 (0) | 2023.05.24 |
---|---|
파이썬에서 긴 f-string을 분할하려면 어떻게 해야 합니까? (0) | 2023.05.24 |
Azure의 새 스토리지 계정과 기존 스토리지 계정의 차이점 (0) | 2023.05.24 |
sed를 사용하여 파일 이름 대량 변경 (0) | 2023.05.24 |
어떤 분기에서 문자열을 도입한 Git 커밋을 어떻게 찾을 수 있습니까? (0) | 2023.05.24 |