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

Jag*_*age 14 mongodb

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

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

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

Chr*_*ett 23

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

$or: [{end_date: null}, {end_date: {$gte: 1376982000}}]
Run Code Online (Sandbox Code Playgroud)

您的整个查询将如下所示:

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

要进行缩放,您需要找到一种方法来删除$gte$lte运算符.MongoDB不能在查询中使用$lte$gte不同属性的组合.


ode*_*fos 6

$ 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"
})
Run Code Online (Sandbox Code Playgroud)

  • @DavidKong,如果混合类型,可能会遇到问题。我认为如果类型不匹配,它会导致 false,所以如果你否定它,你会得到“true”,如果直接使用,你会得到“false”。不过,我不确定也没有检查过。 (2认同)