MongoDB में डॉट (.) वाले फील्ड नाम (कीज़) वाले दस्तावेज़ ढूंढने के लिए, एग्रीगेशन पाइपलाइन का उपयोग करें: $objectToArray → $filter साथ $indexOfBytes → $match।
उदाहरण: डॉट वाली कीज़ वाले दस्तावेज़
> db.demo364.insertOne({
"details" : {
"details1.otherdetails.Name" : {"FirstName":"Chris"}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e57d485d0ada61456dc936d") }
> db.demo364.insertOne({
"details" : {
"details1.otherdetails.Name" : {"FirstName":"David"}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e57d486d0ada61456dc936e") }
दस्तावेज़ देखना
> db.demo364.find();
आउटपुट: दो दस्तावेज़ जिनमें डॉट वाली नेस्टेड की है।
एग्रीगेशन: डॉट वाली कीज़ फ़िल्टर करें
> db.demo364.aggregate([
{
$addFields: {
result: {
$filter: {
input: { $objectToArray: "$details" },
cond: {
$ne: [
{ $indexOfBytes: [ "$$this.k", "." ] },
-1
]
}
}
}
}
},
{
$match: {
$expr: {
$ne: [ { $size: "$result" }, 0 ]
}
}
},
{
$project: { result: 0 }
}
])
परिणाम
दोनों दस्तावेज़ लौटाए जाते हैं क्योंकि उनमें डॉट वाली कीज़ हैं।
चरण व्याख्या
- $objectToArray: ऑब्जेक्ट को
{k: <key>, v: <value>}ऑब्जेक्ट्स की सरणी में बदलता है। - $filter + $indexOfBytes: उन कीज़ को रखता है जिनमें "." है (इंडेक्स ≠ -1)।
- $match + $size: केवल उन दस्तावेज़ों को रखता है जहां फ़िल्टर्ड सरणी गैर-खाली है।
- $project: अस्थायी
resultफील्ड को हटाता है।
चेतावनी
डॉट वाली कीज़ MongoDB में डॉट नोटेशन क्वेरी के साथ हस्तक्षेप कर सकती हैं। जहां संभव हो, उनसे बचें या एग्रीगेशन के साथ सावधानी से क्वेरी करें।