Мне нужны последние журналы из коллекции пользовательских журналов на основе идентификатора пользователя с группой по концепции с использованием MongoDB NodeJS

#node.js #mongodb #mongodb-query #mongoose-schema

#node.js #mongodb #mongodb-запрос #mongoose-schema

Вопрос:

Я хочу, чтобы последние журналы из userlogs коллекции были основаны на userId концепции с группой, например, если у меня есть 10 журналов, записанных с двумя разными пользователями, и я хочу получить сведения о журналах.

Мой код:

 let options = [
  {
    "$sort": {
      "updatedAt": -1
    }
  },
  {
    "$group": {
      "_id": "$userId"
    }
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": 1
      },
      "results": {
        "$push": "$ROOT"
      }
    }
  },
  {
    "$project": {
      "count": 1,
      "results": {
        "$slice": [
          "$results",
          0,
          10
        ]
      }
    }
  }
];
Note.aggregate(options).allowDiskUse(true).exec((err, result) => {
    console.log(result)
});
 

Образцы документов в моей коллекции журналов:

 { userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-04T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-03T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-02T11:31:39.694Z" },
{ userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-01T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-03T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-02T11:31:39.694Z" },
{ userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-01T11:31:39.694Z" }
 

Я ожидаю вывода, подобного приведенному ниже:

 [
    { userId : '57c7f4312b3c9771219bd21c', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" },
    { userId : '57efb93fdc78c816a3a15c4a', logs : "sample entry", "updatedAt": "2020-08-05T11:31:39.694Z" }
]
 

Заранее спасибо

Ответ №1:

  • $sort updatedAt в порядке убывания
  • $group по userId и создайте массив журналов
  • $slice чтобы получить последнюю первую запись
 let options = [
  { $sort: { updatedAt: -1 } },
  {
    $group: {
      _id: "$userId",
      latest: { $push: "$ROOT" }
    }
  },
  { $project: { latest: { $slice: ["$latest", 1] } } }
];
 

Игровая площадка

Комментарии:

1. не могли бы вы, пожалуйста, помочь мне получить этот формат вывода, [ { «_id»: «543543534», «latest»: [ { «id»: «54543543534», «logs»: «образец журнала» } ] } }

2. Вы можете использовать $push вместо $first.

3. да, это работает, но мне нужна только одна запись в формате массива. $ push возвращает массив всех записей в формате идентификатора группы. Причина в том, что мне нужно предоставить два формата с концепцией флага, если последнее значение true означает, что оно вернет массив из одной записи, в противном случае он должен возвращать массив всех записей. Второй формат $ push работает нормально.