Mongodb 创建一个查询,该查询通过组合键返回唯一的结果
我有以下文件:Mongodb 创建一个查询,该查询通过组合键返回唯一的结果,mongodb,Mongodb,我有以下文件: {a: 1, b:1, c:1} {a: 1, b:2, c:1} {a: 1, b:1, c:2} 因此,我需要一些类似于 _.uniqBy(documents, d => d.a + d.b); 因此,结果应该是 {a: 1, b:1, c:1} {a: 1, b:2, c:1} 我想通过mongodb本身进行过滤,以后不会这样做,原因有二: 我使用skip属性,如果我自己过滤标签,那么我必须向skip属性添加我删除的相同数量的重复项。由于可以使用不同的跳过值
{a: 1, b:1, c:1}
{a: 1, b:2, c:1}
{a: 1, b:1, c:2}
因此,我需要一些类似于
_.uniqBy(documents, d => d.a + d.b);
因此,结果应该是
{a: 1, b:1, c:1}
{a: 1, b:2, c:1}
我想通过mongodb本身进行过滤,以后不会这样做,原因有二:
- 我使用
属性,如果我自己过滤标签,那么我必须向skip属性添加我删除的相同数量的重复项。由于可以使用不同的跳过值调用该函数,因此我必须重新计算由于重复而删除的文档数量,而且计算成本太高skip
- 我想使用相同的查询执行
model.count()
我不想修改数据,因为我还有类似于
model.find({c:2})
的东西。数据不是<强>实际<强>重复,但我需要考虑它们对于某些任务的重复< < /p> < p>这是使用<代码> $组< /代码>和<代码> $Project < /C> >的查询。
db.collection.aggregate([
{$group : {
_id : { a : "$a" , b : "$b" } ,
count: { $sum : 1 },
c : {$first : "$c"}}},
{$project : {"_id" : 0, a: "$_id.a", b : "$_id.b", "c" : 1}}
]);
输出:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
方法2:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
此查询将给出不同“C”值的计数和跳过的“C”数
db.collection.aggregate([
{$group : {
_id : { a : "$a" , b : "$b" } ,
count: { $sum : 1 },
c : {$first : "$c"}}},
{$project : {"_id" : 0, a: "$_id.a", b : "$_id.b", "c" : 1,
"numberOfCSkipped" : {$cond: {if : { $gt : ["$count", 1] }, then : {$subtract: ["$count", 1]}, else : 0 }},
"numberOfDifferentCs" : "$count" }}
]);
NumberOfcSkiped-零表示没有重复项,即“a”和“b”组合只有一个“C”
NumberOfDifferentics计算“a”和“b”组合的不同“C”值
输出:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
下面是使用
$group
和$project
进行的查询
db.collection.aggregate([
{$group : {
_id : { a : "$a" , b : "$b" } ,
count: { $sum : 1 },
c : {$first : "$c"}}},
{$project : {"_id" : 0, a: "$_id.a", b : "$_id.b", "c" : 1}}
]);
输出:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
方法2:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
此查询将给出不同“C”值的计数和跳过的“C”数
db.collection.aggregate([
{$group : {
_id : { a : "$a" , b : "$b" } ,
count: { $sum : 1 },
c : {$first : "$c"}}},
{$project : {"_id" : 0, a: "$_id.a", b : "$_id.b", "c" : 1,
"numberOfCSkipped" : {$cond: {if : { $gt : ["$count", 1] }, then : {$subtract: ["$count", 1]}, else : 0 }},
"numberOfDifferentCs" : "$count" }}
]);
NumberOfcSkiped-零表示没有重复项,即“a”和“b”组合只有一个“C”
NumberOfDifferentics计算“a”和“b”组合的不同“C”值
输出:-
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1
}
/* 1 */
{
"c" : 1,
"a" : 1,
"b" : 2,
"numberOfCSkipped" : 0,
"numberOfDifferentCs" : 1
}
/* 2 */
{
"c" : 1,
"a" : 1,
"b" : 1,
"numberOfCSkipped" : 1,
"numberOfDifferentCs" : 2
}
这是一个有趣的方法,谢谢-我有任何方法可以使用
skip
选项,如find()
(或类似的东西)?不确定使用skip可以实现什么效果。我添加了另一种方法来获取C属性的计数。希望有帮助。这是一个有趣的方法,谢谢-我有任何方法可以使用skip
选项,如find()
(或类似的东西)?不确定您希望使用skip实现什么。我添加了另一种方法来获取C属性的计数。希望对您有所帮助。您是否尝试在每个唯一的键组合中跳过doment?或者只是最终输出的一部分。是后者。您是否尝试在每个唯一的键组合中跳过doment?或者只是最终输出的一部分。后者也不例外。