Найти дубликат внутри массива mongodb - PullRequest
1 голос
/ 21 апреля 2019

У меня есть коллекция Mongo с именем Users и структурированная структура, подобная этой

{
    _id: '1234aaa',
    profile: {
        Organizations: [A,B,C,A,B,A]
    }
},
{
    _id: '1234bbb',
    profile: {
        Organizations: [A,B,C]
    }

},
{
    _id: '1234ccc',
    profile: {
        Organizations: [A,B,C,C]
    }

}

Как мне вернуть список всех документов в моей коллекции, ТОЛЬКО если они имеют дублирующее значение в файле profile.organizations.Ожидаемый результат будет:

DupesUsers: {
    {
        User: '1234aaa,
        Dupes: [A,B]
    },
    {
        User: '1234ccc,
        Dupes: [C]
    },
}

Я пытался использовать Aggreagte:

db.getCollection('users').aggregate(
  {$unwind: "$profile.organizations"},
  { $project: {_id: '$_id', org: '$profile.organizations'} },
  { $group: {
        _id: null, 
        occurances: {$push: {'org': '$_id', count: '$count'}}
        }
   }
);

, но я просто не могу обернуться вокруг него.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Вы не за горами, нужны лишь небольшие изменения:

db.getCollection("users").aggregate(
    [
        { 
            "$unwind" : "$profile.organizations"
        }, 
        { 
            "$group" : {
                "_id" : {
                    "dup" : "$profile.organizations", 
                    "id" : "$_id"
                }, 
                "count" : {
                    "$sum" : 1.0
                }
            }
        }, 
        { 
            "$match" : {
                "count" : {
                    "$gt" : 1.0
                }
            }
        }, 
        { 
            "$group" : {
                 _id: "$_id.id",
                 Dupes: {$push: "$_id.dup"}
            }
        }
    ], 
);
0 голосов
/ 21 апреля 2019

Вы можете использовать ниже aggregation

db.collection.aggregate([
  { "$project": {
    "Dupes": {
      "$filter": {
        "input": { "$setUnion": ["$profile.Organizations"] },
        "as": "s",
        "cond": {
          "$gt": [
            { "$size": {
              "$filter": {
                "input": "$profile.Organizations",
                "cond": { "$eq": ["$$this", "$$s"] }
              }
            }},
            1
          ]
        }
      }
    }
  }}
])
...