2014-12-05 116 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}} 
])