Проверка идентичных значений, возвращаемых из конвейера агрегации mongoDB, даже если ключи / идентификаторы записи отличаются - PullRequest
2 голосов
/ 23 октября 2019

У меня есть конвейер агрегации в mongoDB, который возвращает три случайные записи, но я не хочу, чтобы какие-либо значения для этих записей были одинаковыми. Например, я не хочу, чтобы два экземпляра TransactionDetail говорили «foo», даже если они из разных записей. как я могу этого достичь?

Используется запрос mongoDB

db.TABLE.aggregate([{$match: {   pid:{$ne:00000021},   transactionDetail:{$ne:null} }}, {$limit: 100}, {$sample: {   size: 3 }}, {$project: {   transactionDetail:1,   _id: 0 }}])

Пример данных выглядит следующим образом

{ "_id" : ObjectId("5da92bb0b3507b13a8d63556"), "pid" : 00000001, "transactionDate" : "2019-10-10 13:05:00", "transactionValue" : 0.00, "transactionDetail" : "HOME & THINGS-C/SPRING RO", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb0b3507b13a8d63557"), "pid" : 00000002, "transactionDate" : "2019-10-10 06:15:29", "transactionValue" : 0.00, "transactionDetail" : "JUICI PATTIES - LIGUANEA ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb0b3507b13a8d63558"), "pid" : 00000003, "transactionDate" : "2019-10-10 10:52:32", "transactionValue" : 0.00, "transactionDetail" : "MATILDA'S CORNER PHARMACY", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb0b3507b13a8d63559"), "pid" : 00000004, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : null, "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355a"), "pid" : 00000005, "transactionDate" : "2019-10-11 00:00:00", "transactionValue" : 0.00, "transactionDetail" : null, "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355b"), "pid" : 00000006, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : null, "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355c"), "pid" : 00000007, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : null, "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355d"), "pid" : 00000008, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : "COURTS - CONSTANT SP RD  ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355e"), "pid" : 00000009, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : "COURTS - CONSTANT SP RD  ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d6355f"), "pid" : 00000010, "transactionDate" : "2019-10-10 13:14:44", "transactionValue" : 0.00, "transactionDetail" : "CARIBBEAN FLAVORS AND FRA", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63560"), "pid" : 00000011, "transactionDate" : "2019-10-10 17:47:40", "transactionValue" : 0.00, "transactionDetail" : "HUA SQUARE LIMITED       ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63561"), "pid" : 00000012, "transactionDate" : "2019-10-10 16:28:02", "transactionValue" : 0.00, "transactionDetail" : "UNIPET - GREGORY PARK    ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63562"), "pid" : 00000013, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : "DIGICEL DING*    ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63563"), "pid" : 00000014, "transactionDate" : "2019-10-10 12:34:55", "transactionValue" : 0.00, "transactionDetail" : "HI-LO - CROSS ROADS      ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63564"), "pid" : 00000015, "transactionDate" : "2019-10-11 00:00:00", "transactionValue" : 0.00, "transactionDetail" : "FIRE MOUNTAIN GEMS & BEAD", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63565"), "pid" : 00000016, "transactionDate" : "2019-10-10 00:00:00", "transactionValue" : 0.00, "transactionDetail" : "AMZN Mktp US*   ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63566"), "pid" : 00000017, "transactionDate" : "2019-10-11 04:23:08", "transactionValue" : 0.00, "transactionDetail" : "UBER   TRIP              ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63567"), "pid" : 00000018, "transactionDate" : "2019-10-10 18:48:37", "transactionValue" : 0.00, "transactionDetail" : "SHOPPERS FAIR - MANDEVILL", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63568"), "pid" : 00000019, "transactionDate" : "2019-10-10 06:33:29", "transactionValue" : 0.00, "transactionDetail" : "RUBIS WATERLOO - MLT G A ", "system" : "REDACTED" }
{ "_id" : ObjectId("5da92bb2b3507b13a8d63569"), "pid" : 00000020, "transactionDate" : "2019-10-10 21:31:23", "transactionValue" : 0.00, "transactionDetail" : "EASYWORSHIP              ", "system" : "REDACTED" }

Как вы можете видеть, записи 00000008 и 00000009 содержат одно и то же значение TransactionsDetail, но яЯ не хочу, чтобы конвейер возвращал это.

Вот мой конвейер.

[
    {
        '$match': {
            'pid': {
                '$ne': idnum
            }, 
            'transactionDetail': {
                '$ne': None
            }
        }
    }, {
        '$limit': 1000
    }, {
        '$sample': {
            'size': 3
        }
    }, {
        '$project': {
            'transactionDetail': 1, 
            '_id': 0
        }
    }
]

1 Ответ

1 голос
/ 23 октября 2019

Таким образом, при рассмотрении примера набора данных и взгляда на представленный запрос, единственное поле, которое требуется для вывода, - «actionDetail ». Я считаю, что вы хотите 3 случайных уникальных / отличных / взаимоисключающих значений. Я думаю, что этот запрос делает это ...

db.TABLE.aggregate(
[
    { '$match': {
            'pid': { '$ne': "00000021" }, 
            'transactionDetail': { '$ne': null }
    }},
    { $group: {
        _id: '$transactionDetail',
        count: { $sum: 1}
    }},
    { '$limit': 1000 }, 
    { '$sample': { 'size': 3 } },
    { '$project': {
            '_id': 1
        }
    }
]
)

Стратегия состоит в том, чтобы использовать $ group, чтобы преобразовать дубликаты в уникальные значения перед выполнением $ sample.

вы ищете?

...