2015-06-23 77 views
1

我試圖回到Mongodb和我遇到了一些我不知道的東西。 我有這樣的數據結構MongoDB查詢鍵值的變化

> db.ratings.find().pretty() 
{ 
     "_id" : ObjectId("55881e43424cbb1817137b33"), 
     "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
     "type" : "like", 
     "time" : 1434984003156, 
     "u_id" : ObjectId("55817c072e48b4b60cf366a7") 
} 
{ 
     "_id" : ObjectId("55893be1e6a796c0198e65d3"), 
     "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
     "type" : "dislike", 
     "time" : 1435057121808, 
     "u_id" : ObjectId("55817c072e48b4b60cf366a7") 
} 
{ 
     "_id" : ObjectId("55893c21e6a796c0198e65d4"), 
     "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
     "type" : "null", 
     "time" : 1435057185089, 
     "u_id" : ObjectId("55817c072e48b4b60cf366a7") 
} 

我希望能夠做的是數着有一張喜歡或不喜歡留下「空」出計的文檔。所以我應該有一個計數2.我試着去了解它這樣,由此我設置查詢到兩個領域:

db.ratings.find({e_id: ObjectId("5565e106cd7a763b2732ad7c")}, {type: "like", type: "dislike"}) 

但這只是打印出所有三個文件。有什麼理由嗎? 如果它明顯地對不起,現在就拔出我的頭髮。

回答

1

使用以下db.collection.count()方法返回的文件的數量,將匹配find()查詢:

db.ratings.count({ 
    "e_id": ObjectId("5565e106cd7a763b2732ad7c"), 
    type: { 
     "$in": ["like", "dislike"] 
    } 
}) 

db.collection.count()方法相當於db.collection.find(query).count()結構。您所查詢的選擇標準以上可以解釋爲:

給我,因爲他們e_id字段值ObjectId("5565e106cd7a763b2732ad7c")type領域具有任何價值「喜歡」或「不喜歡」的所有文件的計數,通過所描繪$in運算符,用於選擇字段值等於指定數組中任何值的文檔。

0
db.ratings.find({e_id: ObjectId("5565e106cd7a763b2732ad7c")}, 
       {type: "like", type: "dislike"}) 

但這只是打印出所有三個 文件。有什麼理由嗎?如果它明顯地對不起 現在拉出我的頭髮。

這裏的第二個參數是投影find method使用。它指定了應包含的字段 - 無論其值如何。通常,您指定一個布爾值1true以包含該字段。顯然,MongoDB接受其他值爲true。


如果你只需要計數文件,你應該發出一個count command

> db.runCommand({count: 'collection', 
       query: { "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
         type: { $in: ["like", "dislike"]}} 
}) 
{ "n" : 2, "ok" : 1 } 

請注意,蒙戈殼牌提供了count helper

> db.collection.find({ "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
         type: { $in: ["like", "dislike"]}}).count() 
2 

這是說,引用文檔,使用count命令「可導致如果存在孤立文檔或正在進行塊遷移,則計數不準確。「爲了避免這種情況,你可能更喜歡使用聚合框架:

> db.collection.aggregate([ 
    { $match: { "e_id" : ObjectId("5565e106cd7a763b2732ad7c"), 
       type: { $in: ["like", "dislike"]}}}, 
    { $group: { _id: null, n: { $sum: 1 }}} 
]) 
{ "_id" : null, "n" : 2 } 
0

這個查詢應該可以解決你的問題

db.ratings.find({$or : [{"type": "like"}, {"type": "dislike"}]}).count()