$ condのため、コードが機能しません
アキュムレータ演算子ではありません。 これら
のみ アキュムレータ演算子。$group
で使用できます。 ステージ。
レコードに含まれる可能性のあるsource
の値が2つ以下であると想定します 質問で述べたように、条件付きの$project
を追加できます。 $group
をステージングして変更します ステージとして、
コード:
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"
]
}
}
}
])
sourceに2つ以上の可能な値がある可能性がある場合は、次のようにすることができます。
Group
id
による 、firstName
、lastName
およびcode
。source
の一意の値を累積する 、 $ addToSetを使用 オペレーター。- $ redactを使用します
email
以外の値のみを保持する 。 Project
source
の場合、必須フィールド 配列が空です(すべての要素が削除されています)。値を追加しますemail
それに。Unwind
配列ではなくフィールドとしてリストするソースフィールド。(オプション)
コード:
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"
}
}
}
}
])