Дублирует в агрегации с $addToSet

Я довольно новичок в агрегированной структуре в MongoDB, но, насколько я понимаю, $addToSet Функциональность ТОЛЬКО добавляет уникальные значения в массив и игнорирует существующие значения. Так что по какой-то причине приведенный ниже агрегат все еще производит дубликаты

db.tweets.aggregate([
{ 
    $group: { 
        _id: "$_id",
        hashtags: { 
            $addToSet : "$tweet.entities.hashtags.text" 
        }
    }
},
{ $unwind : "$hashtags" }
]);

Оригинальный массив хэштегов:

"hashtags" : [
                {
                    "indices" : [
                        64,
                        73
                    ],
                    "text" : "TONYTour"
                },
                {
                    "indices" : [
                        97,
                        101
                    ],
                    "text" : "NIU"
                },
                {
                    "indices" : [
                        102,
                        106
                    ],
                    "text" : "NIU"
                },
                {
                    "indices" : [
                        107,
                        111
                    ],
                    "text" : "NIU"
                }
            ]
        },

результат:

{
        "_id" : ObjectId("53f4aad7485aee023d000115"),
        "hashtags" : [
            "TONYTour",
            "NIU",
            "NIU",
            "NIU"
        ]
    }

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

{
        "_id" : ObjectId("53f4aad7485aee023d000115"),
        "hashtags" : [
            "TONYTour",
            "NIU"
        ]
    }

1 ответ

Решение

Я думаю, что ваша проблема в этом разделе документации

$addToSet только гарантирует, что в набор не будут добавлены повторяющиеся элементы, и не повлияет на существующие повторяющиеся элементы. $addToSet не гарантирует определенного порядка элементов в модифицированном наборе.

Итак, ваша проблема в том, что дубликаты хэстэгов находятся в одном документе. Вы можете решить это, используя сначала размотку:

db.tweets.aggregate([
{ 

   { $unwind : "$tweet.entities.hashtags" },
    $group: { 
        _id: "$_id",
        hashtags: { 
            $addToSet : "$tweet.entities.hashtags.text" 
        }
    }
}
]);

Это создаст один документ на хэштег, а затем $addToSet не следует добавлять дубликаты

Редактировать: Исправление Нила Ланна

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