सरणी को देखते हुए [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
. की सरणी स्थिति . तो यह सिर्फ प्रत्येक बराबर स्थिति के लिए हैश संरचना बना रहा है, इसे एक सरणी में पास कर रहा है और इसे $or
के सरणी मान के रूप में प्लग कर रहा है हालत।
मुझे शायद पिछले कोड से $cond ऑपरेटर को छोड़ देना चाहिए था ताकि यह हिस्सा स्पष्ट हो।
यहां रूबी ब्रेन के लिए कुछ कोड दिया गया है:
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