1
我在MongoDB的用戶模型的具體數量看起來像這樣:如何計算的記錄,只有鑰匙
{ _id: <some_id>,
name: <some_name>,
preferences: <this is an object with 1-20 key values pair>
}
我想獲得用戶的數量與目前所有的喜好鍵(排名用戶在首選項中有20個鍵。) 我該如何去查詢?
我在MongoDB的用戶模型的具體數量看起來像這樣:如何計算的記錄,只有鑰匙
{ _id: <some_id>,
name: <some_name>,
preferences: <this is an object with 1-20 key values pair>
}
我想獲得用戶的數量與目前所有的喜好鍵(排名用戶在首選項中有20個鍵。) 我該如何去查詢?
如果您有最新的MongoDB 3.4,那麼你可以用$objectToArray
爲此在聚合聲明:
Model.aggregate([
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$cond": {
"if": { "$eq": [
{ "$size": {
"$objectToArray": { "$ifNull": [ "$preferences", { } ] }
}},
20
]},
"then": 1,
"else": 0
}
}
}
}}
])
新的運營商$objectToArray
將採取「鍵/值」對的對象,並把這個成陣列。所以這樣的:
{ "a": 1, "b": 2 }
變爲這樣:
[ { "k": "a", "v": 1 }, { "k": "b", "v": 2 } ]
作爲一個數組,你可以使用運營商如$size
算「鑰匙」的數量,這是現在等於陣列中的條目。
對於早期版本,你可以在JavaScript評價使用$where
條件:
Model.find(function() {
return (this.hasOwnProperty("preferences")) ?
Object.keys(this.preferences).length == 20 : false;
}).count()
後者實際上不是一個「聚合」,但光標計數的真正意義,你可以從一個JavaScript評價得到。
如果某些鍵具有空值,會發生什麼情況。我應該如何去除這些?我想我可以在這裏使用的東西https://stackoverflow.com/questions/33123396/group-in-mongo-excluding-null-values但想知道如果你知道更優雅的東西? – WABBIT0111
@ WABBIT0111當然。您可以添加'null'檢查屬性不存在的地方,這是在答案中添加的。或者你是在談論「偏好」屬性的「內部」鍵?在後一種情況下,您可以根據使用的操作添加'$ filter'或'.filter()'操作。因此,我認爲後者的含義類似於「{」首選項「:{」a「:1,」b「:null}}」您在哪裏詢問如何排除「b」鍵,因爲它的值是'null'?這真的可以歸結爲透視,但只要簡短地看一下所引用的鏈接,我想任何事情都比這更優雅。 –
Thx爲這兩種情況的詳盡解釋。我認爲這兩種情況都非常有用,我學到了很多東西。謝謝 ! – WABBIT0111