与えられた配列[4,7,90,1]
クエリに必要なのはこれです:
db.collection.aggregate([
{ "$project": {
"user_id": 1,
"content": 1,
"date": 1,
"weight": { "$or": [
{ "$eq": ["$user_id": 4] },
{ "$eq": ["$user_id": 7] },
{ "$eq": ["$user_id": 90] },
{ "$eq": ["$user_id": 1] },
]}
}},
{ "$sort": { "weight": -1, "date": -1 } }
])
つまり、その$or
に含まれるすべてのアイテムについてです。 条件、user_id
フィールドは指定された値に対してテストされ、$eq
1
を返します または0
true
の場合 またはfalse
。
コードで行うことは、ビルドする配列にあるアイテムごとです。 $or
の配列条件 。つまり、equals条件ごとにハッシュ構造を作成し、それを配列に渡し、それを$or
の配列値としてプラグインするだけです。 状態。
この部分がより明確になるように、前のコードから$cond演算子を除外する必要があったでしょう。
RubyBrainのコードは次のとおりです。
userList = [4, 7, 90, 1];
orCond = [];
userList.each do |userId|
orCond.push({ '$eq' => [ 'user_id', userId ] })
end
pipeline = [
{ '$project' => {
'user_id' => 1,
'content' => 1,
'date' => 1,
'weight' => { '$or' => orCond }
}},
{ '$sort' => { 'weight' => -1, 'date' => -1 } }
]
個別の重みが必要で、キーと値のペアを想定する場合は、$ condでネストする必要があります:
db.collection.aggregate([
{ "$project": {
"user_id": 1,
"content": 1,
"date": 1,
"weight": { "$cond": [
{ "$eq": ["$user_id": 4] },
10,
{ "$cond": [
{ "$eq": ["$user_id": 7] },
9,
{ "$cond": [
{ "$eq": ["$user_id": 90] },
7,
{ "$cond": [
{ "$eq": ["$user_id": 1] },
8,
0
]}
]}
]}
]}
}},
{ "$sort": { "weight": -1, "date": -1 } }
])
これは単なる戻り値であることに注意してください。これらは順番に並んでいる必要はありません。そして、あなたはその生成について考えることができます。
この構造を生成するには、ここを参照してください:
https://stackoverflow.com/a/22213246/2313887