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

Jak načíst poslední objekt pole ve vloženém dokumentu v Mongoose?

Váš „nejnovější“ dokument bude vždy na konci vašeho pole, pokud jej nějak neupravíte. Přidávání položek do polí bude vždy přejít na „konec“ nebo „připojit“ ke stávajícím položkám, pokud se použije s $push operátor nebo přidány pomocí metod manipulace s polem v kódu klienta.

Pouze operátoři jako $addToSet nebo explicitně pomocí modifikátorů pro $push operace to změní.

Když jste na konci pole, obvykle chcete použít $slice , se záporným indexem pro získání položek z "konce" pole:

Model.findById("55d3a39565698bbc68079e31")
    .select({ "comments": { "$slice": -1 }})
    .exec(function(err,doc) {

    })

Pokud jste pole skutečně upravili, jak bylo zmíněno dříve, kde nejnovější datum není posledním prvkem v poli, měli byste použít $sort modifikátor aktualizací. Obecně by to bylo "nemístné", pokud byste požádali o $position modifikátor nebo jste použili $addToSet . $position by bylo záměrné a nemůžete také třídit, ale vždy můžete pole seřadit po $addToSet operace, jako je tato, která umístí všechna data do pořadí, aniž by se změnil jakýkoli další obsah pole:

Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
   { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)

S upraveným polem stejný $slice operace se vztahuje na dotazy, protože pole je nyní v pořadí podle data.

Pokud je však vaším záměrem ponechat pole ve vašich dokumentech mimo pořadí nebo v jiném požadovaném pořadí, ale chcete také získat nejnovější datum, můžete použít .aggregate() na $sort a načtěte $last položka pole:

Model.aggregate(
    [
        { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
        { "$unwind": "$comments" },
        { "$sort": { "comments.date": 1 } },
        { "$group": {
            "_id": "$_id",
            "author": { "$first": "$author" },
            "link": { "$first": "$link" },
            "title": { "$first": "$title" },
            "date": { "$first": "$date" },
            "comments": { "$last": "$comments" }
        }}
    ]
)

Upozorňujeme, že při použití agregačního rámce s mongoose je _id "autocasting", ke kterému dochází v jiných dotazech, neprobíhá (toto je záměrné), takže je nutné přetypovat na ObjectId value sami, pokud data ještě nejsou k dispozici v této podobě a přišla jako řetězec.

To jsou vaše způsoby, jak získat poslední prvek (volitelně explicitně seřazený) z pole.




  1. $cond operátor java kód

  2. jak se vyhnout $push-ing null v rámci mongo agregace

  3. Meteor:neočekávaný mongo výstupní kód 100

  4. Failover pro replikaci MySQL (a další) – Mělo by být automatické?