मोंगोल्डब प्रलेखन के अनुसार , का एक संयोजनdistinct
किसी एकल संग्रह या दृश्य में किसी निर्दिष्ट फ़ील्ड के लिए अलग मानों को ढूँढता है और परिणाम को किसी सरणी में लौटाता है।
और अनुक्रमित संग्रह संचालन वे हैं जो किसी दिए गए कुंजी या सूचकांक के लिए सभी संभावित मूल्यों को लौटाएंगे:
एक सरणी देता है जो दस्तावेजों की एक सूची रखता है जो संग्रह पर मौजूदा अनुक्रमित की पहचान और वर्णन करता है
इसलिए किसी दिए गए तरीके में, कोई भी निम्न की तरह एक विधि का उपयोग कर सकता है, सभी पंजीकृत अनुक्रमितों के लिए एक संग्रह को क्वेरी करने के लिए, और वापस लौटें, कुंजी के लिए अनुक्रमित के साथ एक ऑब्जेक्ट का कहना है (यह उदाहरण NodeJS के लिए async / प्रतीक्षा का उपयोग करता है, लेकिन स्पष्ट रूप से आप किसी अन्य अतुल्यकालिक दृष्टिकोण का उपयोग कर सकते हैं):
async function GetFor(collection, index) {
let currentIndexes;
let indexNames = [];
let final = {};
let vals = [];
try {
currentIndexes = await collection.indexes();
await ParseIndexes();
//Check if a specific index was queried, otherwise, iterate for all existing indexes
if (index && typeof index === "string") return await ParseFor(index, indexNames);
await ParseDoc(indexNames);
await Promise.all(vals);
return final;
} catch (e) {
throw e;
}
function ParseIndexes() {
return new Promise(function (result) {
let err;
for (let ind in currentIndexes) {
let index = currentIndexes[ind];
if (!index) {
err = "No Key For Index "+index; break;
}
let Name = Object.keys(index.key);
if (Name.length === 0) {
err = "No Name For Index"; break;
}
indexNames.push(Name[0]);
}
return result(err ? Promise.reject(err) : Promise.resolve());
})
}
async function ParseFor(index, inDoc) {
if (inDoc.indexOf(index) === -1) throw "No Such Index In Collection";
try {
await DistinctFor(index);
return final;
} catch (e) {
throw e
}
}
function ParseDoc(doc) {
return new Promise(function (result) {
let err;
for (let index in doc) {
let key = doc[index];
if (!key) {
err = "No Key For Index "+index; break;
}
vals.push(new Promise(function (pushed) {
DistinctFor(key)
.then(pushed)
.catch(function (err) {
return pushed(Promise.resolve());
})
}))
}
return result(err ? Promise.reject(err) : Promise.resolve());
})
}
async function DistinctFor(key) {
if (!key) throw "Key Is Undefined";
try {
final[key] = await collection.distinct(key);
} catch (e) {
final[key] = 'failed';
throw e;
}
}
}
इसलिए मूल _id
सूचकांक के साथ एक संग्रह को क्वेरी करते हुए , निम्नलिखित को लौटाएगा (परीक्षण संग्रह में परीक्षण के समय केवल एक दस्तावेज है):
Mongo.MongoClient.connect(url, function (err, client) {
assert.equal(null, err);
let collection = client.db('my db').collection('the targeted collection');
GetFor(collection, '_id')
.then(function () {
//returns
// { _id: [ 5ae901e77e322342de1fb701 ] }
})
.catch(function (err) {
//manage your error..
})
});
ध्यान रहे, यह NodeJS चालक के लिए मूल तरीकों का उपयोग करता है। जैसा कि कुछ अन्य उत्तरों ने सुझाव दिया है, अन्य दृष्टिकोण हैं, जैसे कि समग्र रूपरेखा। मुझे व्यक्तिगत रूप से यह दृष्टिकोण अधिक लचीला लगता है, क्योंकि आप आसानी से बना सकते हैं और परिणाम को वापस करने के लिए ठीक-ठीक ट्यून कर सकते हैं। जाहिर है, यह केवल शीर्ष-स्तरीय विशेषताओं को संबोधित करता है, न कि नेस्टेड लोगों को। इसके अलावा, यह सुनिश्चित करने के लिए कि सभी दस्तावेजों का प्रतिनिधित्व किया जाता है, माध्यमिक सूचकांक (मुख्य _ एक के अलावा अन्य) होना चाहिए, उन अनुक्रमितों को सेट किया जाना चाहिए required
।