30

我在 MongoDB 中有一个集合,其中包含两个日期,这些日期定义了某些内容是否是最新的。所以我有一个“end_date”,它可以为空,也可以有一个时间值。当前具有空 end_date 或未来时间的项目。我的查询如下所示:

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

这对我来说看起来很合适,但我需要不同的方法吗?如果我可以避免的话,我不想有一个布尔标志来说明日期是否是最新的。

4

4 回答 4

30

您正在寻找$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"
})

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

于 2013-08-20T21:29:13.033 回答
29

$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"
})
于 2018-08-30T07:32:57.323 回答
0

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

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

于 2021-04-20T07:19:45.443 回答
-1

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

于 2014-11-06T20:36:26.857 回答