2014-01-17 63 views
1

在MongoDB中,我們怎麼能得到特定密鑰的計數在數組MongoDB中獲取特定的鍵的數量在一個陣列

{ 
"_id" : ObjectId("52d9212608a224e99676d378"), 
"business" : [ 
    { 
    "name" : "abc", 
    "rating" : 4.5 
    }, 
    { 
    "name" : "pqr" 
    }, 
    { 
    "name" : "xyz", 
    "rating" : 3.6 
    } 
] 
} 
在上面的例子中

,企業是一個數組(用「名」和/或「評級」鍵)

我如何才能獲得只有「評級」鍵存在的業務數組的計數?

預期成果是:2

回答

6

看起來你必須使用Aggregation Framework。特別是你需要$unwind你的數組,然後匹配只包含rating字段的元素,然後$group文件恢復到原始格式。

嘗試這樣:

db.test.aggregate([ 
    { $match: { /* your query criteria document */ } }, 
    { $unwind: "$business" }, 
    { $match: { 
     "business.rating": { $exists: 1 } 
     } 
    }, 
    { $group: { 
     _id: "$_id", 
     business: { $push: "$business" }, 
     business_count: { $sum: 1 } 
     } 
    } 
]) 

結果如下所示:

{ 
    _id: ObjectId("52d9212608a224e99676d378"), 
    business: [ 
    { name: "abc", rating: 4.5 }, 
    { name: "xyz", rating: 3.6 } 
    ], 
    business_count: 2 
} 

UPD看起來OP不通過包裝文檔_id場要分組結果。不幸的是$group表達式必須指定_id的值,否則它會失敗而異常。但是,該值實際上可以是恆定的(例如,原始的null'foobar'),因此只有一個結果組具有收集式聚合。

+0

我喜歡你的代碼示例(它工作,所以+1)。將來,請使用'test'數據庫(而不是'foo'),這樣我們就可以在mongo shell中保存輸入和編輯....並且SO註釋;) – ixe013

+1

@ ixe013 OK;)BTW'foo'不是數據庫名稱 - 這是一個集合名稱。集合'test'沒有什麼特別的含義(不像'test'數據庫是mongo shell默認的那個)。 – vbo

+0

是的,收集。當我讀到這個問題時,我在默認的'test'集合中創建了OP文檔。沒什麼大不了的,我想今天早上過了一個短暫的夜晚後,我只是脾氣暴躁! – ixe013

相關問題