Sesuai dokumentasi mongoldb , kombinasi daridistinct
Menemukan nilai berbeda untuk bidang tertentu di satu koleksi atau melihat dan mengembalikan hasilnya dalam array.
dan operasi pengumpulan indeks adalah apa yang akan mengembalikan semua nilai yang mungkin untuk kunci yang diberikan, atau indeks:
Mengembalikan array yang menyimpan daftar dokumen yang mengidentifikasi dan menjelaskan indeks yang ada pada koleksi
Jadi dalam metode yang diberikan seseorang dapat menggunakan metode seperti yang berikut, untuk menanyakan koleksi untuk semua indeks terdaftarnya, dan kembali, ucapkan objek dengan indeks untuk kunci (contoh ini menggunakan async / menunggu NodeJS, tetapi jelas Anda dapat menggunakan pendekatan asinkron lainnya):
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;
}
}
}
Jadi, meminta koleksi dengan _id
indeks dasar , akan mengembalikan yang berikut (koleksi tes hanya memiliki satu dokumen pada saat tes):
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..
})
});
Pikiran Anda, ini menggunakan metode asli ke Driver NodeJS. Seperti yang disarankan beberapa jawaban lain, ada beberapa pendekatan lain, seperti kerangka kerja agregat. Saya pribadi menemukan pendekatan ini lebih fleksibel, karena Anda dapat dengan mudah membuat dan menyempurnakan cara mengembalikan hasil. Jelas, ini hanya membahas atribut tingkat atas, bukan yang bersarang. Juga, untuk menjamin bahwa semua dokumen terwakili jika ada indeks sekunder (selain yang _id utama), indeks tersebut harus ditetapkan sebagai required
.