我对MongoDB中的聚合框架还不熟悉,但根据我的理解,$addToSet
功能只会向数组添加唯一值并忽略现有值。因此,由于某种原因,下面的聚合仍然会产生重复
db.tweets.aggregate([
{
$group: {
_id: "$_id",
hashtags: {
$addToSet : "$tweet.entities.hashtags.text"
}
}
},
{ $unwind : "$hashtags" }
]);
原始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"
]
}
答案 0 :(得分:2)
我的猜测是你的问题是documentation
的这一部分$ addToSet仅确保没有重复项添加到 设置并不会影响现有的重复元素。 $ addToSet 不保证修改集中元素的特定排序。
所以你的问题是,重复的hastags在同一个文档中。您可以先使用unwind来解决这个问题:
db.tweets.aggregate([
{
{ $unwind : "$tweet.entities.hashtags" },
$group: {
_id: "$_id",
hashtags: {
$addToSet : "$tweet.entities.hashtags.text"
}
}
}
]);
这将为每个主题标签创建一个文档,然后$addToSet
不应添加重复项
编辑:Neil Lunn的更正