लिस्टिंग में मैं जिस "इंडेंटेशन" का उपयोग कर रहा हूं, उसे ध्यान में रखते हुए, यह वास्तव में आप जो कर रहे हैं उससे अधिक लंबा लग सकता है, लेकिन वास्तव में ऐसा नहीं है।
यह $ का उपयोग करने का एक और वास्तव में अच्छा उदाहरण है। नक्शा
जैसा कि MongoDB 2.6 और उच्चतर के लिए उपलब्ध है। $unwindका कुछ उपयोग अभी भी बाकी है कोड>
, लेकिन "अनवाउंड" होने वाले सरणियों में वास्तव में केवल एक . होता है उनमें तत्व। तो कृपया मेरे "highlander" को क्षमा करें
संदर्भ जिनका मैं विरोध नहीं कर सका :)
db.users.aggregate([
// Match your document or documents
{ "$match": {
"commentUpvotes.id": 12
}},
// Get the one "up-votes" entry that matches
{ "$project": {
"posts": 1,
"comments": 1,
"commentUpVotes": {
"$setDifference": [
{
"$map": {
"input": "$commentUpvotes",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.id", 12 ] },
"$$el",
false
]
}
}
},
[false]
]
}
}},
// There is only one!
{ "$unwind": "$commentUpVotes" },
// Get the one comments entry that matches
{ "$project": {
"posts": 1,
"comments": {
"$setDifference": [
{
"$map": {
"input": "$comments",
"as": "el",
"in": {
"$cond": [
{
"$eq": [
{ "$substr": [ "$$el.id", 0, 4 ] },
"$commentUpVotes.commentId"
]
},
"$$el",
false
]
}
}
},
[false]
]
},
"commentUpVotes": 1
}},
// And there is only one!
{ "$unwind": "$comments" },
// Get the one post that matches
{ "$project": {
"posts": {
"$setDifference": [
{
"$map": {
"input": "$posts",
"as": "el",
"in": {
"$cond": [
{
"$eq": [
"$$el.id",
"$comments.postId"
]
},
"$$el",
false
]
}
}
},
[false]
]
},
"comments": 1,
"commentUpVotes": 1
}},
// Optionally group back to arrays. There can be only one!
{ "$group": {
"_id": "$_id",
"posts": { "$first": "$posts" },
"comments": { "$push": "$comments" },
"commentUpVotes": { "$push": "$commentUpVotes" }
}}
])
तो अंतिम परिणाम होगा:
{
"_id" : ObjectId("539065d3cd0f2aac5f55778e"),
"posts" : [
{
"title" : "post1",
"id" : "123"
}
],
"comments" : [
{
"id" : 1910,
"postId" : "123",
"title" : "comment1",
"comment" : "some comment",
"user" : "user13"
}
],
"commentUpVotes" : [
{
"id" : 12,
"commentId" : "1910",
"upvotedBy" : "user91"
}
]
}
मुझे पता है कि आपने "कोई स्कीमा परिवर्तन नहीं" के लिए कहा था, लेकिन वास्तव में यह कहने के लिए एक स्कीमा परिवर्तन नहीं है कि आपकी id
रखना एक अच्छा विचार है एक सुसंगत प्रकार के यहाँ मान। वर्तमान में आप इस प्रक्रिया में पूर्णांक और तार मिला रहे हैं (मुझे आशा है कि यह सिर्फ एक उदाहरण है) जो एक अच्छा विचार नहीं है।
इस प्रकार कुछ "सीमित कास्टिंग" है जो वास्तव में <का उपयोग करके यहां नियोजित उपलब्ध है। मजबूत>$सबस्ट्र
, हालांकि आपका वास्तविक समाधान वास्तव में ऐसा करने के तरीके में भिन्न हो सकता है। मैं दृढ़ता से सुझाव देता हूं कि यदि डेटा को ठीक करने की वास्तव में आवश्यकता है तो उसे ठीक करें।
किसी भी मामले में, $ के लिए एक बहुत अच्छा उपयोग नक्शा