2017-04-19 77 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