查询MongoDB中具有给定属性集的文档

时间:2015-05-15 13:00:40

标签: mongodb mongodb-query

我在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但没有xyz。如何仅返回同时包含timestampx y z的文档?

我认为有一些非常简单的逻辑可以添加到查询中,但我在搜索时似乎找不到任何东西。

2 个答案:

答案 0 :(得分:2)

第一个参数filter对象确定匹配必须满足的条件。在这种情况下,时间戳必须在一定的时间间隔内。

第二个参数是一个投影,主要用于删除不必要的字段,特别是如果数据很大(如某些嵌入式二进制文档,文件或其他内容)。

如果您想确保文档设置为xyz,您可以使用$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})