sql >> Databáze >  >> NoSQL >> MongoDB

párování polí interně v mongodb

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ů:

  1. Vytvořte projekci dokumentu pouze pomocí studentId a nové pole s polem obsahujícím pouze id (takže první dokument by obsahoval [23, 55] .
  2. Pomocí této struktury $unwind . Tím se vytvoří nový dočasný dokument pro každý prvek pole v studentIdComp pole.
  3. 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ázvem isStudentEqual který porovnává rovnost dvou polí, studentId a studentIdComp . Pamatujte, že v tomto okamžiku existuje jeden dočasný dokument, který obsahuje tato dvě pole.
  4. Nakonec zkontrolujte, zda je srovnávací hodnota isStudentEqual je true a vrátí tyto dokumenty (které budou obsahovat původní dokument _id a studentId .
  5. 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).


  1. Případ hashovaných indexů MongoDB

  2. Umístění databáze mongodb na mac

  3. Upozornění na ukončení podpory MongoDB při používání Mongoose

  4. Jak mohu $addToSet objekt do pole a také $sort pomocí MongoDB?