Men so'ragan MongoDB to'plamida har bir hujjat ma'lum bir vaqtda elementni ifodalaydi. Hujjatni yangilashda bir xil element identifikatori va yangi vaqt tamg'asi bilan yangi hujjat yaratiladi. Barcha elementlar noyob element identifikatorlariga ega.
Tasavvur qilish uchun ushbu misolni ko'rib chiqing. Biz elementni bitta qayta ko'rib chiqishdan boshlaymiz:
{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar
}
Yangilangandan so'ng bizda bir xil itemId va turli vaqt belgilariga ega bo'lgan elementning ikkita tahriri mavjud.
[{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar"
},
{
_id: y,
itemId: 123,
createdOn: ISODate("2014-02-09T14:26:20.102Z"),
field1: "baz",
field2: "fiz"
}]
Oxirgi tahririda ma'lum bir so'rovni qondiradigan barcha narsalarni qanday topish mumkin?
Mening joriy (noto'g'ri) yondashuvim avvalo mos keladigan hujjatlarni topish, keyin vaqt tamg'asi bo'yicha tartiblash, ularni itemId bo'yicha guruhlash va guruhdagi birinchi hujjatdagi qiymatlarni qaytarishdir:
ItemModel.aggregate({ $match: { field1: "foo"} }).sort({createdOn: -1}).group(
{
_id: '$itemId', // grouping key
createdOn: {$first: '$createdOn'},
field1: {$first: '$field1'},
field2: {$first: '$field2'}
}).exec(...);
Bu notoʻgʻri, chunki u elementlarning eski tahrirlariga mos keladi. Faqat elementlarning so'nggi tahrirlari mos kelishi kerak. Yuqoridagi misolda bu yondashuv "123" bandini qaytaradi, to'g'ri natija esa bo'sh natijalar to'plamidir.