Запрос поиска MongoDB: возврат повторяющихся записей, но с уникальными существующими идентификаторами - PullRequest
1 голос
/ 27 мая 2020

У меня есть документ коллекции, в котором говорится test:

{id: 123,
 lId: abc,
 cnum: [{num: 112, type:R}]
},
{id: 234,
 lId: abc,
 cnum:[{ num: 112, type: R}]
},
{id: 345,
 lId: cbd,
 cnum: [{num: 112, type: R}]
},
{id: 456,
 lId: efg,
 cnum: [{num: 121, type:R}]
}

Я хочу, чтобы запрос возвращал значения с повторяющимся значением cnum num, но с уникальным lId. То есть он должен возвращать

id: 123,lId: abc, cnum.num: 112, id: 345,lId: cbd, cnum.num: 112

, но в настоящее время он возвращает

id: 123,lId: abc,cnum.num: 112, id: 234, lId: abc, cnum.num: 112, id: 345,lId: cbd, cnum.num: 112

Мой текущий скрипт также возвращает повторяющийся lId. Вот мой сценарий:

var groupCnum = db.getCollection('test').aggregate([
{ $match: {"cnum.0": {$exists: true}}},
{ $unwind: "$cnum" },
{ $match: { "cnum.type": "R" } },
{ $group: { "_id": "$cnum.num", "count": { $sum: 1 } } },
{ $match: {"count": {"$gt": 1} } }
], {allowDiskUse: true}).map(record => record._id);

var duplicatedCnum = db.getCollection('test').aggregate([
{ $match: {"lId": {$nin: groupCnum}}},
{ $match: { "cnum.num": {$in: groupCnum} } },
{ $unwind: "$cnum" },
{ $match: { "cnum.type": "R" } },
{ $sort: {cnum: 1} },
{ $limit: 100}
], {allowDiskUse: true});
var fieldNames = ["id", "lId", "cnum.num"];
print(fieldNames.join(","));

Кто-нибудь может подсказать, что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

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

db.getCollection('test').aggregate([
 {$match: {"cnum.0": { $exists: true }} },
 {$unwind: "$cnum"},
 {$match: { "cnum.type": "R"}},
 {$group: {"_id": {"lId": "$lId", "cnum": "$cnum.num" } } },
 {$group: {"_id": "$_id.cnum", "count": {$sum: 1}}},
 {$match: {"count": {"$gt": 1}}
}])
0 голосов
/ 27 мая 2020

Вы можете использовать следующий конвейер:

db.getCollection('test').aggregate([
    {
        $unwind: "$cnum"
    },
    {
        $group: {
            _id: "$cnum.num",
            lId: {$addToSet: "$lId"},
            doc: {$push: "$$ROOT"}
        }
    },
    {
        $match: {
            "lId.0": {$exists: true}
        }
    },
    {
        "$unwind": "$doc"
    },
    {
        $replaceRoot: {
            newRoot: "$doc"
        }
    }
]);

Обратите внимание, что для этого ввода:

{id: 123, lId: abc, cnum: [{num: 112, type:R}, {num: 224, type: R}]}
{id: 124, lId: cdb, cnum: [{num: 112, type:R}]}
{id: 125, lId: xyz, cnum: [{num: 224, type:R}]}

Вы получите следующий результат:

{id: 123, lId: abc, cnum: {num: 112, type:R}}
{id: 123, lId: abc, cnum: {num: 224, type:R}}

{id: 124, lId: cdb, cnum: {num: 112, type:R}}
{id: 125, lId: xyz, cnum: {num: 224, type:R}}

Поэтому, если вы хотите снова сгруппировать abc, вы должны снова добавить его в $group в конце.

...