Mongodb агрегация - получить все последние вставленные группы документов в зависимости от времени - PullRequest
1 голос
/ 04 апреля 2020

быстрая головоломка для тех, кто знаком с агрегацией mongodb, если хотите. например, у нас есть простая модель:

const listingSchema = new mongoose.Schema({
  img: {type: String},
  url: {type: String, required: true},
  price: {type: Number, default: 0},
  roomType: {type: String, required: true},
  nights: {type: Number, required: true},
  time: {type: Date, required: true, index: true},
});

Я периодически вставляю группу объектов и хочу запросить последнюю добавленную группу, это можно просто описать с помощью текущего кода решения:

const lastListings = async () => {
  const time = await Listing.find({}).sort({time: -1}).limit(1);
  return Listing.find({time: time.time});
}

но мне это не нравится, так как с агрегацией это можно сделать более элегантно - просто любите этот инструмент и старайтесь понять его хорошо. у кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Вы можете попробовать при агрегации ниже:

db.collection.aggregate([
  /** Sort on entire collection is not much preferrable */
  /** Group on 'time' field & push all matching docs to 'docs' array */
  { $group: { _id: "$time", docs: { $push: "$$ROOT" } } },
  /** Now there will significantly less documents, do a sorting on '_id' field (which is time) */
  { $sort: { _id: -1 } },
  /** limit to 1 doc (All latest inserted docs will be inside 'docs' array of this one doc ) */
  { $limit: 1 },
  /** unwind 'docs' array */
  { $unwind: "$docs" },
  /** Replace docs object as new root for each document in collection  */
  { $replaceRoot: { newRoot: "$docs" } },
]);

Тест: MongoDB-Playground

Примечание: Есть индекс в поле time.

0 голосов
/ 04 апреля 2020

С агрегацией вы можете сделать это следующим образом:

db.getCollection('listings').aggregate([
    { $sort: {time: -1} },
    { $limit: 1 }
])
...