我试图回到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"})
但这只是打印出所有三个文件。有什么缘故吗? 如果它明显很明显我很抱歉拉出我的头发。
答案 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使用的投影。它指定应包含的字段 - 无论其值如何。通常,您指定布尔值1
或true
以包含该字段。显然,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()