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?或者只是最终输出的一部分。后者也不例外。