Mã của bạn không hoạt động vì $ cond
không phải là một toán tử tích lũy. Chỉ những
này toán tử bộ tích lũy, có thể được sử dụng trong $group
sân khấu.
Giả sử bản ghi của bạn chứa không nhiều hơn hai giá trị có thể có của source
như bạn đề cập trong câu hỏi của mình, bạn có thể thêm $project
có điều kiện giai đoạn và sửa đổi $group
giai đoạn như,
Mã:
db.customer.aggregate([
{
$group: {
"_id": {
"id": "$id",
"firstName": "$firstName",
"lastName": "$lastName",
"code": "$code"
},
"sourceA": { $first: "$source" },
"sourceB": { $last: "$source" }
}
},
{
$project: {
"source": {
$cond: [
{ $eq: ["$sourceA", "email"] },
"$sourceB",
"$sourceA"
]
}
}
}
])
Trong trường hợp có thể có nhiều hơn hai giá trị có thể có cho nguồn, thì bạn có thể làm như sau:
-
Group
bởiid
,firstName
,lastName
và mãcode
. Tích lũy các giá trị duy nhất củasource
, sử dụng $ addToSet toán tử. - Sử dụng $ redact
để chỉ giữ các giá trị khác với
email
. -
Project
các trường bắt buộc, nếusource
mảng trống (tất cả các phần tử đã bị xóa), hãy thêm giá trịemail
cho nó. -
Unwind
trường nguồn để liệt kê nó dưới dạng một trường chứ không phải một mảng. (tùy chọn)
Mã:
db.customer.aggregate([
{
$group: {
"_id": {
"id": "$id",
"firstName": "$firstName",
"lastName": "$lastName",
"code": "$code"
},
"sourceArr": { $addToSet: { "source": "$source" } }
}
},
{
$redact: {
$cond: [
{ $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
"$$PRUNE",
"$$DESCEND"
]
}
},
{
$project: {
"source": {
$map: {
"input":
{
$cond: [
{ $eq: [{ $size: "$sourceArr" }, 0] },
[{ "source": "item" }],
"$sourceArr"]
},
"as": "inp",
"in": "$$inp.source"
}
}
}
}
])