Дублирует в агрегации с $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
не следует добавлять дубликаты
Редактировать: Исправление Нила Ланна