Mongo 在聚合中使用带限制和跳过的排序时出现数据库重复问题
Mongo DB duplication issue while using sorting with limit and skip in aggregation
在使用 skip 和 limit 排序获取记录时遇到重复记录的问题:
收集数据:
{
"_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
}
聚合查询 1:
db.testing.aggregate([{$sort : { "like": -1 }},{$skip : 0},{$limit:4}]);
输出:
{
"_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
}
聚合查询 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
}
结论:
当改变 skip 0->4 时,得到名称为 F,I,A
的重复记录
不明白为什么会这样?
根据您的收集数据,您按具有共同值的键进行排序。
在第一个聚合中,您使用的是 (skip,limit) => (0,4) 在这种情况下 mongo 按所有文档的顺序对文档进行排序,结果已排序。
在第二次聚合中,您再次使用 (skip,limit) => (4,4) 在这种情况下 mongo 正在对所有文档中的文档进行排序,其中文档可以重复但具有相同的值在键中。
因此,在按数据排序后,您应该根据需要使用任何唯一键(“_id”或“name”)对数据进行排序
注意:密钥应该是唯一的
类似下面的内容
db.testing.aggregate([
{
$sort : {
"percentage": -1,
"_id" : 1
},
},
{
$skip : 0
},
{
$limit:4
}
]);
在使用 skip 和 limit 排序获取记录时遇到重复记录的问题:
收集数据:
{
"_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
}
聚合查询 1:
db.testing.aggregate([{$sort : { "like": -1 }},{$skip : 0},{$limit:4}]);
输出:
{
"_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
}
聚合查询 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
}
结论:
当改变 skip 0->4 时,得到名称为 F,I,A
的重复记录不明白为什么会这样?
根据您的收集数据,您按具有共同值的键进行排序。
在第一个聚合中,您使用的是 (skip,limit) => (0,4) 在这种情况下 mongo 按所有文档的顺序对文档进行排序,结果已排序。
在第二次聚合中,您再次使用 (skip,limit) => (4,4) 在这种情况下 mongo 正在对所有文档中的文档进行排序,其中文档可以重复但具有相同的值在键中。
因此,在按数据排序后,您应该根据需要使用任何唯一键(“_id”或“name”)对数据进行排序 注意:密钥应该是唯一的
类似下面的内容
db.testing.aggregate([
{
$sort : {
"percentage": -1,
"_id" : 1
},
},
{
$skip : 0
},
{
$limit:4
}
]);