Pokud je to možné, navrhoval bych nastavit podmínku při ukládání dat, abyste mohli provést rychlou kontrolu pravdivosti (isInStudentsList
). Bylo by super rychlé provést tento typ dotazu.
Jinak existuje poměrně složitý způsob použití kanálu agregačního rámce k tomu, co chcete v jediném dotazu:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Vzhledem k vašemu příkladu vstupu by výstup byl:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Stručné vysvětlení kroků:
- Vytvořte projekci dokumentu pouze pomocí
studentId
a nové pole s polem obsahujícím pouzeid
(takže první dokument by obsahoval[23, 55]
. - Pomocí této struktury $unwind
. Tím se vytvoří nový dočasný dokument pro každý prvek pole v
studentIdComp
pole. - Nyní vezměte tyto dokumenty a vytvořte novou projekci dokumentu, která bude mít i nadále
studentId
a přidá nové pole s názvemisStudentEqual
který porovnává rovnost dvou polí,studentId
astudentIdComp
. Pamatujte, že v tomto okamžiku existuje jeden dočasný dokument, který obsahuje tato dvě pole. - Nakonec zkontrolujte, zda je srovnávací hodnota
isStudentEqual
je true a vrátí tyto dokumenty (které budou obsahovat původní dokument_id
astudentId
. - Pokud byl student na seznamu vícekrát, možná budete muset seskupit výsledky podle
studentId
nebo_id
abyste zabránili duplicitám (ale nevím, že byste to potřebovali).