Пн goose запрос $ с последним документом по указанному c полю - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь запросить документы в MongoDB с помощью find (), но не получается получить нужные документы. Скажем, у нас есть документы

Pet = [
{project: "foo", date: 11111, data: "Lion"}, 
{project: "bar", date: 1111, data: "Tiger"},
{project: "foo", date: 2222, data: "Cat"},
{project: "bee", date: 3333, data: "Rat"},
{project: "pet", date: 4444, data: "Cow"},
{project: "yeti", date: 2233, data: "Dog"}, ...];

Затем я просто хочу запросить только 1 документ каждого проекта в массиве ["foo", "pet"]. Исходя из этого примера данных, я ожидаю получить

[{project: "foo", date: 11111, data: "Lion"},
{project: "pet", date: 4444, data: "Cow"}]

Я пытаюсь

Pet.find({project: {$in: ["foo","pet"]}, {},{ sort: { date: -1 },limit: 1}); 

Я получаю только 1 документ, так как я устанавливаю лимит, равный 1. Как я могу получить ожидаемый запрос

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы должны использовать агрегацию

    db.collection.aggregate([
  {
    "$match": {
      "project": {
        "$in": [
          "pet",
          "foo"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$project",
      "date": {
        "$first": "$date"
      },
      "data": {
        "$first": "$data"
      }
    }
  },
  {
    "$project": {
      "date": 1,
      "data": 1
    }
  },
  {
    "$sort": {
      "date": -1
    }
  }
])

вот рабочий пример: https://mongoplayground.net/p/rIDuXTeHg4i

0 голосов
/ 03 мая 2020

Если я правильно понял ваш вопрос, это может помочь.

Предположение: у вас есть коллекция проектов с полями из вашего примера.

db.projects.aggregate(
 [
 { $match: { project: { $in: [ "foo","pet" ] } } },
 { $sort: { project: 1, date: 1 } },
 {
   $group:
     {
       _id: "$project",
       firstProject: { $first: "$date" }
     }
 }

])

Примечание: Вы можете немного поиграть с разделом $ group вашего агрегата, чтобы показать другие записи в группе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...