给定数组
[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
.
您在代码中所做的是针对数组中的每一项
建造
$或
$或
条件。
我可能应该把$cond操作符从前面的代码中去掉,这样这部分就更清楚了。
下面是一些Ruby大脑的代码:
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 } }
]
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