我在mongo.exe中编写了一个查询,如下所示:
db.sheep.find( { "timestamp" : {
"$gt":ISODate("2015-05-15T10:00:00.000z"),
"$lt":ISODate("2015-05-15T10:05:10.000z") } },
{"x":1,"y":1,"z":1,"timestamp":1})
但是,部分退回的文档包含timestamp
但没有x
,y
,z
。如何仅返回同时包含timestamp
和x y z
的文档?
我认为有一些非常简单的逻辑可以添加到查询中,但我在搜索时似乎找不到任何东西。
答案 0 :(得分:2)
第一个参数filter对象确定匹配必须满足的条件。在这种情况下,时间戳必须在一定的时间间隔内。
第二个参数是一个投影,主要用于删除不必要的字段,特别是如果数据很大(如某些嵌入式二进制文档,文件或其他内容)。
如果您想确保文档设置为x
,y
和z
,您可以使用$exists
检查:
db.sheep.find(
{
"timestamp" : {
"$gt" : ISODate("2015-05-15T10:00:00.000z"),
"$lt" : ISODate("2015-05-15T10:05:10.000z")
},
"x": { "$exists": true },
"y": { "$exists": true },
"z": { "$exists": true }
});
但是,请注意,这通常是糟糕的架构设计的标志。根据定义,$exists
具有最差情况选择性,因此不希望这些查询快速。
答案 1 :(得分:1)
您可以使用$exists
运算符。
db.sheep.find(
{
"timestamp" : {
"$gt":ISODate("2015-05-15T10:00:00.000z"),
"$lt":ISODate("2015-05-15T10:05:10.000z")
},
"x": { "exists": true },
"y": { "exists": true },
"z": { "exists": true }
},
{"x":1,"y":1,"z":1,"timestamp":1})