MongoDB: получить все записи с последней ревизией - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь запросить предварительно созданную MongoDB, которая хранит информацию о ревизиях для каждой записи Пример того, как выглядят данные, таков:

{
  "_id": ObjectId("5cd48bad15447900012fae00"),
  "sku": "abc123",
  "_revision": 5
  "_created": ISODate("2019-05-10T15:00:00.000Z"),
  "provider": "MySupplier5"
}

В этом примере есть записи для одной и той же записи с:

  • отличается _id
  • То же sku
  • То же provider
  • _revision установлен на 1, 2, 3 и 4 (по одному на документ)
  • разные _created даты

Что я хочу выбрать:

Все документы с установленным поставщиком "MySupplier5", но только самая последняя редакция.

Я попытался прочитать документацию по Aggregate , но не смог получить то, что мне было нужно. Я чувствовал, что подход, который я использую, чтобы обойти это, исключительно неэффективен и надеялся, что кто-то может указать мне правильное направление.

Прямо сейчас я делаю это:

  1. Получить все SKU:

    db.products.distinct('sku', { provider: "MySupplier5" }, { _id: 0, sku: 1 })

  2. Переберите все SKU и получите самую последнюю версию:

    db.products.find({ sku: 'abc123' }).sort({ revision: -1 }).limit(1)

Это работает, но все более неэффективно.

Мне удалось запустить эти два запроса, используя Mongoid , и я уверен, что смогу перевести все, что указано, в эквивалент Ruby. Я просто не могу понять, как сказать «только дайте мне самую последнюю редакцию» в Монго.

Спасибо!

1 Ответ

0 голосов
/ 10 июля 2019

Для тех, кто ищет ответ, который я получил на основании ссылки, приведенной здесь, я перечисляю его здесь (извинения за поздний, поздний ответ).

Мне потребовались все следующие ссылки, чтобы узнать и понять, что именно мне нужно:

[
  {
    "$group": {
      "_id": "$sku",
      "maxRevision": { "$max": "$revision" },
      "originalDocuments": { "$push": "$$ROOT" }
    }
  },
  {
    "$project": {
      "originalDocument": {
        "$filter": {
          "input": "$originalDocuments",
          "as": "doc",
          "cond": {
            "$and": [
              { "$eq": ["abc123", "$$doc.sku"] },
              { "$eq": ["$maxRevision", "$$doc.revision"] }
            ]
          }
        }
      }
    }
  },
  {
    "$unwind": "$originalDocument"
  }
]

...