2014-12-05 62 views
1

我有以下的Json結構 -如何使用mongodb獲取重複密鑰的計數?

[{ 
cName:"A", 
"datastores" : [ 
    { 
     "status":"unused" 
    }, 
    { 
     "name" : "datastore1", 
     "status":"used" 
    }, 
    { 
     "name" : "onNetApp7m", 
     "status":"used" 
    }, 
    { 
     "name" : "datastore1", 
     "status":"used" 
    } 
    ], 
}, 
{ 
cName:"B", 
"datastores" : [ 
    { 
     "name" : "dsn", 
     "status":"used" 
    }, 
    { 
     "name" : "dsn", 
     "status":"used" 
    }, 
    { 
     "name" : "datastore2", 
     "status":"used" 
    } 
    ], 
} 
] 

我想找到陣列/列表「DS」只有這樣的名字,其計數大於1 我想下面的輸出 -

[{ 
"cName":"A", 
"name" : "datastore1", 
"count": 2 
}, 
{ 
"cName":"B", 
"name" : "dsn", 
"count": 2 
}] 

目前,爲了獲得計數,我正在用我的代碼邏輯處理它。 是否有可能使用mongo從查詢本身獲得計數?

+0

'ds'已更改爲'datastores' - 它是一個錯字? – BatScream 2014-12-05 08:41:16

+0

@BatScream是的它是.. – Vishwas 2014-12-05 08:52:53

回答

1

你需要如下彙總:

  • Unwinddatastores陣列。
  • Group記錄由cNamedatastores名稱字段組成。 獲取每組中記錄的count
  • 我們需要匹配的group現在是具有count > 1的組。
  • Project必填字段。

代碼:

db.collection.aggregate([ 
{$unwind:"$datastores"}, 
{$group:{"_id":{"cName":"$cName","name":"$datastores.name"},"count":{$sum:1}}}, 
{$match:{"count":{$gt:1}}}, 
{$project:{"_id":0,"cName":"$_id.cName","name":"$_id.name","count":1}} 
])