Cho mảng [4,7,90,1]
những gì bạn muốn trong truy vấn của mình là:
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 } }
])
Vì vậy, đó là những gì, cho mọi mục có trong $or
đó điều kiện, user_id
trường được kiểm tra dựa trên giá trị được cung cấp và $eq
trả về 1
hoặc 0
cho true
hoặc false
.
Những gì bạn làm trong mã của mình là cho từng mục bạn có trong mảng mà bạn xây dựng điều kiện mảng của $or
. Vì vậy, nó chỉ tạo một cấu trúc băm cho mỗi điều kiện bằng, chuyển nó vào một mảng và cắm nó vào làm giá trị mảng cho $or
điều kiện.
Tôi có lẽ nên để toán tử $ cond ra khỏi mã trước đó để phần này sẽ rõ ràng hơn.
Đây là một số mã cho Ruby Brain:
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 } }
]
Nếu bạn muốn có các trọng số riêng lẻ và chúng tôi sẽ giả định các cặp giá trị khóa, thì bạn cần phải lồng với $ 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 } }
])
Lưu ý rằng đó chỉ là một giá trị trả về, những giá trị này không cần phải theo thứ tự. Và bạn có thể nghĩ về thế hệ của điều đó.
Để tạo cấu trúc này, hãy xem tại đây:
https://stackoverflow.com/a/22213246/2313887