Дедупинг результатов mongoDB с сохранением последних вставленных - PullRequest
1 голос
/ 16 июня 2020

Допустим, у меня есть группа людей:

{ _id: ObjectId(1), name: "Bob" }
{ _id: ObjectId(1), name: "Alice" }
{ _id: ObjectId(2), name: "Bob" }
{ _id: ObjectId(2), name: "Alice" }
{ _id: ObjectId(2), name: "Charlie" }

Я упрощаю ObjectId (n), чтобы представить n как временную метку по умолчанию, которую mon go включает в ObjectId.

Теперь у меня есть приложение, которое требует выборки людей с уникальными именами, показывая только те записи, которые были вставлены последними. Так что в конечном итоге приложению нужны только эти записи:

{ _id: ObjectId(2), name: "Bob" }
{ _id: ObjectId(2), name: "Alice" }
{ _id: ObjectId(2), name: "Charlie" }

Я не хочу иметь уникальный индекс для name, потому что я действительно хочу хранить повторяющихся людей. Ограничение уникальности исходит из бизнес-логики приложения c, не имеющей отношения к коллекции.

Есть ли способ, которым я могу запросить mon go, чтобы напрямую получить эти результаты, или это logi c то, что я должен написать в моем приложении после получения всех записей? У меня мало опыта работы с mongoDB, поэтому может быть очевидное решение, о котором я не знаю.

1 Ответ

0 голосов
/ 17 июня 2020

Вы можете написать запрос агрегирования:

db.collection.aggregate([
  {
    $group: {
      _id: "$name", // group on name field
      doc: { $last: "$$ROOT" } // push last doc into a field `doc` (last inserted doc will come as last one in iteration)
    }
  },
  {
    $replaceRoot: { newRoot: "$doc" } // make `doc` field as new root of document
  }
])

Тест: mongoplayground

Ссылка: агрегат-трубопровод

...