MongoDB使用更改键的值来查询

时间:2015-06-23 11:31:35

标签: 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"})  

但这只是打印出所有三个文件。有什么缘故吗? 如果它明显很明显我很抱歉拉出我的头发。

3 个答案:

答案 0 :(得分: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") AND type字段的文档,其中值为“like”或“不喜欢“,如 $in 运算符所示,该运算符选择字段值等于指定数组中任何值的文档。

答案 1 :(得分: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 }

请注意Mongo Shell为此提供了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 }

答案 2 :(得分:0)

此查询应解决您的问题

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