MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да извлека последния обект на масив във вграден документ в Mongoose?

Вашият "последен" документ винаги ще бъде в края на вашия масив, освен ако не промените по някакъв начин. Добавянето на елементи в масиви винаги ще отива в „края“ или „добавя“ към съществуващите елементи, когато се използва с $push оператор или добавен с помощта на методи за манипулиране на масиви в клиентския код.

Само оператори като $addToSet или изрично използване на модификатори към $push операция ще промени това.

Като такъв, когато сте в края на масив, това, което обикновено искате да направите, е да използвате $slice , с отрицателен индекс, за да получите елементи от „края“ на масива:

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

    })

Ако действително сте модифицирали масива, както беше споменато по-рано, където последната дата не е последният елемент в масива, тогава трябва да използвате $sort модификатор на актуализации. Като цяло би било „не на място“ само ако поискате $position модификатор или сте използвали $addToSet . $position би било умишлено и не можете също да сортирате, но винаги можете да сортирате масива след $addToSet операция като тази, която подрежда всички дати, без да променя друго съдържание на масива:

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

С модифицирания масив същия $slice операцията се прилага за заявки, тъй като масивът вече е подреден по дата.

Ако обаче вашето намерение е да оставите масива в документите си в нередовен ред или в друг ред, който желаете, но също така искате да получите най-новата дата, тогава можете да използвате .aggregate() до $sort и извлечете $last запис в масив:

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" }
        }}
    ]
)

Отбелязвайки, че когато използвате рамката за агрегиране с mongoose, _id "автоматично предаване", което се случва в други заявки, не се случва (това е по проект), така че е необходимо да се прехвърля към ObjectId оценявайте себе си, ако данните вече не са налични в тази форма и са дошли като низ.

Това са вашите начини да получите последния елемент (опционално изрично сортиран) от масив.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Грешка при създаване на bean с име „mongobee“, дефинирано в ресурса за пътя на класа

  2. Как да използвам Javascript обект в конвейера за агрегиране на mongodb?

  3. Първи стъпки с нерелационни бази данни с помощта на Mongodb 🍃

  4. Обвивката на Mongo не може да се свърже с Azure CosmosDB

  5. Mongoid Association Създаване на (нежелани) записи