MongoDB - 查找值为null或小于X的结果

时间:2013-08-20 18:33:13

标签: mongodb

我在MongoDB中有一个集合,其中有两个日期,用于定义某些内容是否是最新的。所以我有一个可以为null的“end_date”,或者可能有一个时间值。当前具有null end_date或将来的时间的项。我的查询如下:

program_enrollments.find( {"start_date":{"$lte":1376982000},"end_date":[null,{"$gte ":1376982000}],"client":"52002d02cc94a31a0f000000"}, [] )

这对我来说很合适,但我需要一种不同的方法吗?我不希望有一个布尔标志,表示如果我可以避免它,日期是否是最新的。

4 个答案:

答案 0 :(得分:19)

您正在寻找$or操作,该操作接受一系列操作。它会是这样的:

$or: [{end_date: null}, {end_date: {$gte: 1376982000}}]

您的整个查询如下:

program_enrollments.find({
  start_date: {$lte: 1376982000},
  $or: [
    {end_date: null}, 
    {end_date: {$gte: 1376982000}}
  ],
  client:"52002d02cc94a31a0f000000"
})

要进行扩展,您需要找到一种方法来移除$gte$lte运算符。 MongoDB无法在查询中的不同属性上使用$lte$gte的组合。

答案 1 :(得分:2)

$ or运算符有时会很麻烦,特别是如果您具有其他带有多个选项的字段,那么您必须将所有$ or嵌套在$ and中。

另一种选择是使用求反运算符:

"end_date": {"$not": {"$lt":1376982000}}

这将为您提供与

相同的结果

$or: [{end_date: null}, {end_date: {$gte: 1376982000}}]

您的查询看起来像这样,这比IMO更干净:

program_enrollments.find({
  start_date: {$lte: 1376982000},
  end_date: {$not: {$lt: 1376982000}},
  client:"52002d02cc94a31a0f000000"
})

答案 2 :(得分:0)

您可以使用{end_date: null}询问变量是否存在,而不是{end_data: {$exists: false}}。请注意,如果end_date位于具有null值的文档中,则第一个将起作用,而第二个不起作用。

答案 3 :(得分:0)

$and 运算符可能相当。特别是如果您有其他具有多个选项的字段,那么您必须将所有 $or 嵌套在 $and 中。

db.program_enrollments.find({"$and":[{"$or":[{"object.key":{},{"object.key":{"$gt":"2021-01 -01","$lt":"2021-01-31"}}}]},{"object.key":""}]})