Yad*_*tan 4 sorting skip limit mongodb aggregation-framework
通过使用跳过和限制进行排序来获取记录时遇到重复记录的问题:
收集数据:
{
"_id" : ObjectId("594b507c9b9469ec9da6a78b"),
"name" : "F",
"percentage" : 60.0,
"weightedFilter" : 2.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78c"),
"name" : "I",
"percentage" : 80.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78d"),
"name" : "J",
"percentage" : 80.0,
"weightedFilter" : 1.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78e"),
"name" : "A",
"percentage" : 100.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78f"),
"name" : "K",
"percentage" : 80.0,
"weightedFilter" : 1.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a790"),
"name" : "G",
"percentage" : 60.0,
"weightedFilter" : 2.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a791"),
"name" : "H",
"percentage" : 80.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a792"),
"name" : "B",
"percentage" : 100.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
Run Code Online (Sandbox Code Playgroud)
汇总查询1:
db.testing.aggregate([{$sort : { "like": -1 }},{$skip : 0},{$limit:4}]);
Run Code Online (Sandbox Code Playgroud)
输出:
{
"_id" : ObjectId("594b507c9b9469ec9da6a78d"),
"name" : "J",
"percentage" : 80.0,
"weightedFilter" : 1.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78b"),
"name" : "F",
"percentage" : 60.0,
"weightedFilter" : 2.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78c"),
"name" : "I",
"percentage" : 80.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78e"),
"name" : "A",
"percentage" : 100.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
Run Code Online (Sandbox Code Playgroud)
汇总查询2:
db.testing.aggregate([{$sort : { "like": -1 }},{$skip : 4},{$limit:4}]);
{
"_id" : ObjectId("594b507c9b9469ec9da6a78b"),
"name" : "F",
"percentage" : 60.0,
"weightedFilter" : 2.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78c"),
"name" : "I",
"percentage" : 80.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a78e"),
"name" : "A",
"percentage" : 100.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
{
"_id" : ObjectId("594b507c9b9469ec9da6a792"),
"name" : "B",
"percentage" : 100.0,
"weightedFilter" : 0.0,
"like" : 1.0,
"attraction" : 1.0
}
Run Code Online (Sandbox Code Playgroud)
结论:
更改跳过0-> 4时,得到名称为F,I,A的重复记录
不明白为什么会这样?
根据您的收集数据,您将按具有共同值的键进行排序。
在第一个聚合聚合中,您使用(skip,limit)=>(0,4),在这种情况下,mongo从所有文档中按顺序对文档进行排序,并对结果进行排序。
在第二个聚合中,您再次使用(skip,limit)=>(4,4),在这种情况下,mongo从所有文档中对文档进行排序,其中文档可以重复,而键值相同。
因此,在对数据进行排序之后,您应该根据需要使用任何唯一键(“ _id”或“名称”)对数据进行排序注意:键应该是唯一的
像下面这样
db.testing.aggregate([
{
$sort : {
"percentage": -1,
"_id" : 1
},
},
{
$skip : 0
},
{
$limit:4
}
]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |