Как избежать дублирования значений?

Я новичок в Mongo Db и был бы признателен за помощь с этим query.my mongodb. Пересечение данных с таким же числом идентификаторов базы данных основано на create_date, как отображать каждую запись идентификатора трансекции в первой записи.

 db.collection.aggregate([{
     {"$project": {
     "RESOURCE_ID": 1,
     "TRANSACTION_ID":1,
     "CREATE_DATE":1
   }}

  ]) 

выход:

      RESOURCE_ID         TRANSACTION_ID              CREATE_DATE   
1      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:30IST2018"
2      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:29IST2018"
3      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:29IST2018"
4      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:29IST2018"
5      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:28IST2018"

ожидаемый результат:

       RESOURCE_ID         TRANSACTION_ID              CREATE_DATE   
1      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:30IST2018"
2      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:29IST2018"

1 ответ

Решение

Это то, что вы хотите:db.collection.aggregate([{"$sort": {CREATE_DATE: 1}},{$group:{"_id": "$RESOURCE_ID", TRANSACTION_ID: {$first: "$TRANSACTION_ID"}, "CREATE_DATE": {$first: "$CREATE_DATE"}}}])

Что он делает - сортирует все документы по дате в порядке возрастания, потому что сначала мы хотим получить самый старый документ (обратите внимание на sort пункт).
Затем он группирует документы по полю "RESOURCE_ID" (которое помечено как новое _id) и принимает $first TRANSACTION_ID и $first CREATE_DATE.

Обратите внимание, что вам придется преобразовывать свои временные метки в фактические временные метки, чтобы монго действительно понимало порядок меток времени. В противном случае Монго будет сортировать их как строки, а это не то, что вы хотите

Пример:

> db.collection.find().pretty()
{
    "_id" : ObjectId("5bd2bf353ca22147747ec212"),
    "RESOURCE_ID" : "100-101",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142",
    "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
}                                                 
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec213"),
    "RESOURCE_ID" : "100-101",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142",
    "CREATE_DATE" : ISODate("2017-10-14T10:53:53Z")
}
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec214"),
    "RESOURCE_ID" : "100-102",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111",
    "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
}
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec215"),
    "RESOURCE_ID" : "100-102",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111",
    "CREATE_DATE" : ISODate("2017-10-14T10:53:53Z")
}


> db.collection.aggregate([{"$sort": {CREATE_DATE: 1}},{$group:{"_id": "$RESOURCE_ID", TRANSACTION_ID: {$first: "$TRANSACTION_ID"}, "CREATE_DATE": {$first: "$CREATE_DATE"}}}])
{ "_id" : "100-102", "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111", "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
{ "_id" : "100-101", "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142", "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")

Также стоит отметить, что вы должны добавить индексы для CREATE_DATE потому что вы сортируете по этому полю, и RESOURCE_ID потому что Монго должен отсортировать его, чтобы сгруппировать по нему

Другие вопросы по тегам