2017-04-19 48 views
1

我有这些文件:创建,通过组合键返回唯一结果的查询

{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属性,如果我用我自己的过滤器标签,然后我要添加到跳过酒店我删除重复的相同。由于该功能可以用不同的跳过值被调用,我不得不重新计算有多少文件删除,因为重复的,这将是计算过于昂贵

  • 我想用相同的查询做model.count()

我不想修改数据,因为我也有类似model.find({c:2})。这些数据是不是真实的重复,但我需要把它们当作重复执行某些任务

+0

你是否试图在每个键的唯一组合中跳过'douments?或者只是最终的输出。 [$跳过](https://docs.mongodb.com/manual/reference/operator/aggregation/skip/)做后者。 – Veeram

回答

0

下面是使用$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 
} 

方法2: -

该查询将得到的 “C” S和的 “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" }} 
    ]); 

numberOfCSkipped - 零表示不存在重复,即只有一个 “C” 为 “a” 和 “b” 的组合

numberOfDifferentCs - 的 “C” 不同的值的计数S表示“ a”和 “b” 的组合

输出: -

/* 1 */ 
{ 
    "c" : 1, 
    "a" : 1, 
    "b" : 2, 
    "numberOfCSkipped" : 0, 
    "numberOfDifferentCs" : 1 
} 

/* 2 */ 
{ 
    "c" : 1, 
    "a" : 1, 
    "b" : 1, 
    "numberOfCSkipped" : 1, 
    "numberOfDifferentCs" : 2 
} 
+0

这是一个有趣的方法,谢谢 - 有什么办法可以像'find()'(或类似的东西)一样使用'skip'选项? – rpadovani

+0

不确定你想跳过什么。我添加了另一种方法来获取C属性的数量。希望它有帮助。 – notionquest