2017-06-05 63 views
1

我在MongoDB的用戶模型的具體數量看起來像這樣:如何計算的記錄,只有鑰匙

{ _id: <some_id>, 
    name: <some_name>, 
    preferences: <this is an object with 1-20 key values pair> 
} 

我想獲得用戶的數量與目前所有的喜好鍵(排名用戶在首選項中有20個鍵。) 我該如何去查詢?

回答

1

如果您有最新的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評價得到。

+0

如果某些鍵具有空值,會發生什麼情況。我應該如何去除這些?我想我可以在這裏使用的東西https://stackoverflow.com/questions/33123396/group-in-mongo-excluding-null-values但想知道如果你知道更優雅的東西? – WABBIT0111

+0

@ WABBIT0111當然。您可以添加'null'檢查屬性不存在的地方,這是在答案中添加的。或者你是在談論「偏好」屬性的「內部」鍵?在後一種情況下,您可以根據使用的操作添加'$ filter'或'.filter()'操作。因此,我認爲後者的含義類似於「{」首選項「:{」a「:1,」b「:null}}」您在哪裏詢問如何排除「b」鍵,因爲它的值是'null'?這真的可以歸結爲透視,但只要簡短地看一下所引用的鏈接,我想任何事情都比這更優雅。 –

+0

Thx爲這兩種情況的詳盡解釋。我認爲這兩種情況都非常有用,我學到了很多東西。謝謝 ! – WABBIT0111