エラーを再現することはできませんが、質問にいくつかの「タイプミス」があるため、実際に何が発生しているかわかりません。
ただし、実際にMongoDB 2.6以降を使用していると仮定すると、おそらくが必要になります。 $ setIntersection
または $ setIsSubset
$ setUnion
ではなく演算子
。これらの演算子は、比較対象の配列の「一致する」コンテンツを意味します。ここで、 $ setUnion
提供されたアレイを既存のアレイと組み合わせるだけです:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": {
"$size": {
"$setIntersection": [ "$offices", [ "FL", "SC" ]]
}
},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
集合演算子
がない以前のバージョンでは $ unwind
を使用しているだけです
アレイを操作するには、同じ種類の $ cond
$ group
>
すべてを元に戻すには:
db.people.aggregate([
{ "$unwind": "$offices" },
{ "$group": {
"_id": "$_id",
"first_name": { "$first": "$first_name" },
"last_name": { "$first": "$last_name",
"sticky": { "$sum": { "$cond": [
{ "$or": [
{ "$eq": [ "$offices": "FL" ] },
{ "$eq": [ "$offices": "SC" ] },
]},
1,
0
]}},
"offices": { "$push": "$offices" }
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
しかし、あなたは確かに正しい方向に進んでいました。正確なニーズを得るには、適切なセット操作またはその他の方法を選択するだけです。
または、必要なものを取得する方法を投稿したので、そのような「順序付きマッチング」を作成するためのより良い方法は次のとおりです。
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": { "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "FL" ] }
}
}},
2,
{ "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "SC" ] }
}
}},
1,
0
]}
]},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
そして、それは、「SC」よりも「FL」を含む「オフィス」、したがって他のすべてのドキュメントよりも優先され、単一のフィールド内で操作を実行します。また、 $ unwind
集合演算子のない以前のバージョンでは。 $ cond
ステートメント。