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í
studentIda 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
studentIdComppole. - Nyní vezměte tyto dokumenty a vytvořte novou projekci dokumentu, která bude mít i nadále
studentIda přidá nové pole s názvemisStudentEqualkterý porovnává rovnost dvou polí,studentIdastudentIdComp. Pamatujte, že v tomto okamžiku existuje jeden dočasný dokument, který obsahuje tato dvě pole. - Nakonec zkontrolujte, zda je srovnávací hodnota
isStudentEqualje true a vrátí tyto dokumenty (které budou obsahovat původní dokument_idastudentId. - Pokud byl student na seznamu vícekrát, možná budete muset seskupit výsledky podle
studentIdnebo_idabyste zabránili duplicitám (ale nevím, že byste to potřebovali).