現在、 $ filter 配列集計演算子で $ in 演算子を使用することはできません。
これがドキュメントスキーマであるとしましょう:
{
_id: 1,
users: [
{
_id: 'a',
accounts: ['x', 'y', 'z']
},
{
_id: 'b',
accounts: ['j','k','l']
}
]
}
aggregate
を使用して、users
配列の内容に基づいてaccounts
のフィルター処理された配列を持つドキュメントを取得したいと思います。
[〜#〜] if [〜#〜]$in
が$filter
演算子で機能する場合、次のようになります。
db.test.aggregate([
{
$project: {
'filtered_users': {
$filter: {
input: '$users',
as: 'user',
cond: {
$in: ['$$user.accounts', ['x']]
}
}
}
}
}
])
xはinのアカウントであるため、最初のユーザーのみをfiltered_users
に返します。
しかし、私が言ったように、これは機能せず、エラーが発生します:
"無効な演算子 '$ in'"
$filter
演算子ではサポートされていないためです。
これで、$unwind
と通常の$match
演算子を使用してそれを実行できることがわかりましたが、結果を元に戻すために$group
を使用する必要があるため、集計がはるかに長く(そして醜く)なります。配列として-これは必要ありません
私の質問は、$filter
演算子を操作して目的の結果を得る他の方法があるかどうかです。
$in
は配列の集約操作ではサポートされていないため、代わりに$setIsSubset
を使用することもできます。詳細については、 this linkを参照してください。集計クエリは次のようになります
db.test.aggregate([
{
$project: {
'filtered_users': {
$filter: {
input: '$users',
as: 'user',
cond: {
$setIsSubset: [['x'], '$$user.accounts']
}
}
}
}
}])
このクエリは、[x]
の配列のサブセットとしてuser.accounts
を持つ要素のみを返します。