Как взять дубликаты записей в mongodb - PullRequest
0 голосов
/ 11 октября 2018

Здесь у меня есть два документа, в этих документах childNodes массив ID является дублирующим средством, я хочу взять userID и pedagogyID записи, согласно второму документу моих документов в массиве childNodes 798 идет дубликат, поэтому я хочу взять записи

Документы

 {
    "userID" : "A",
    "pedagogyID" : "100",
    "summary" : {
    "LearnProgress" : {
            "childNodes" : [
                            {
                                "ID" : "123",
                                "status" : "in-progress"
                            },
                            {
                                "ID" : "456",
                                "status" : null
                            },
                            {
                                "ID" : "333",
                                "status" : null
                            }
                        ],
            }
    }
}

{
"userID" : "B",
"pedagogyID" : "200",
"summary" : {
"LearnProgress" : {
"childNodes" : [
                {
                    "ID" : "789",
                    "status" : "in-progress"
                },
                {
                    "ID" : "1010",
                    "status" : null
                },
                {
                    "ID" : "789",
                    "status" : null
                }
            ],
}
}
}

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

   {
"userID" : "B",
"pedagogyID" : "200",
}

МОЙ код

 db.collectionname.aggregate(
[
  {"$unwind":"$summary.LearnProgress.childNodes"},
  {"$group":{
    "_id":{"_id":"$_id","ID":"$summary.LearnProgress.childNodes.ID"},
    "userID":{"$first":"$userID"},
    "pedagogyID":{"$first":"$pedagogyID"},
    "count":{"$sum":1}
  }},
  {"$match":{"count":{"$gt":1}}},
  {"$group":{"_id":{"userID":"$userID","pedagogyID":"$pedagogyID"}}},
  {"$replaceRoot":{"newRoot":"$_id"}}    
],
{ allowDiskUse:true }
)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
db.collectionname.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $unwind: {
                path : "$summary.LearnProgress.childNodes",

            }
        },

        // Stage 2
        {
            $group: {
            _id:'$summary.LearnProgress.childNodes.ID',
            count:{$sum:1},
            pedagogyID:{$first:'$pedagogyID'},
            userID:{$first:'$userID'}

            }
        },

        // Stage 3
        {
            $match: {
            count:{$gt:1}
            }
        },

        // Stage 4
        {
            $project: {
                userID:1,
                pedagogyID:1,
                _id:0
            }
        },

    ]



);
0 голосов
/ 11 октября 2018

Вы можете использовать ниже агрегации.

db.colname.aggregate([
  {"$unwind":"$summary.LearnProgress.childNodes"},
  {"$group":{
    "_id":{"_id":"$_id","ID":"$summary.LearnProgress.childNodes.ID"},
    "userID":{"$first":"$userID"},
    "pedagogyID":{"$first":"$pedagogyID"},
    "count":{"$sum":1}
  }},
  {"$match":{"count":{"$gt":1}}},
  {"$group":{"_id":{"userID":"$userID","pedagogyID":"$pedagogyID"}}},
  {"$replaceRoot":{"newRoot":"$_id"}}    
],{"allowDiskUse":true})
...