mongodb-如果数组中的元素之一与查询匹配,则忽略文档

时间:2018-12-24 12:02:32

标签: arrays mongodb mongodb-query

我在用户集合中有一个用户对象,如下所示:

{
  "username": "bahramhasanov",
  "sessions": [
    {
      "time": "2018-12-10 12:30"
    },
    {
      "time": "2018-10-11 13:30"
    }
  ]}

现在,我想让用户在'2018-10-01'和'2018-10-15'之间没有任何会话。 当我用$ elemMatch和$ not查询时,我得到bahramhasanov,因为他的会话超出了此日期范围。

我使用了以下查询:

db.users.find({sessions:{$elemMatch: {"time": {$not:{$gt: ISODate('2018-10-01'),$lt: ISODate('2018-10-15')}}}}})

2 个答案:

答案 0 :(得分:1)

要查询在一个日期范围内没有任何会话的用户,您将需要查询在该日期范围之外的会话的用户,然后查询不在其中的用户。在您的查询中,您将获得会话在日期范围内的用户,这实际上将返回会话在日期范围内和日期范围之外的用户,而不会返回会话在日期范围内的用户。在集合方面,让我们考虑

O =“会话在日期范围之外的用户”

I =“在日期范围内进行会话的用户”

A =“所有用户”

O∩I =“在日期范围之内和之外进行会话的用户”

O∪I =“在日期范围之内或之外进行会话的用户”

现在,您需要

A \ O,要执行此操作,您需要找到O,然后从A中过滤掉它的项目。

答案 1 :(得分:1)

您必须使用$not查询运算符,以便不仅与$lte$gte一起反对整个$elemMatch运算符

时间也是String而非ISODate格式

db.collection.find({
  "sessions": {
    "$not": {
      "$elemMatch": {
        "time": {
          "$gt": ISO("2018-12-17T20:00:00.000+0000"),
          "$lt": ISO("2018-12-17T20:00:00.000+0000")
        }
      }
    }
  }
})