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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb - 如果数组中的某个元素与查询匹配,则忽略文档相关的知识,希望对你有一定的参考价值。

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

{
  "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')}}}}})
答案

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

而且时间是在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")
        }
      }
    }
  }
})
另一答案

要查询日期范围之间没有任何会话的用户,您需要查询具有日期范围之外的会话的用户,然后查询不在其中的用户。在您的查询中,您将获得在日期范围内具有会话的用户,这将确实返回在日期范围内且在日期范围之外的会话并且不会在日期范围内返回用户的用户。就集合而言,让我们考虑一下

O =“具有超出日期范围的会话的用户”

我=“在日期范围内有会话的用户”

A =“所有用户”

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

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

现在,你需要

A \ O并且为了做到这一点,你需要找到O然后从A过滤掉它的项目。

以上是关于mongodb - 如果数组中的某个元素与查询匹配,则忽略文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

在Java中查询具有完全匹配字段MongoDB的数组元素

MongoDB计数按数组元素分组的数组中的匹配字符串

如何计算另一个数组 MongoDB 中数组中的匹配元素

Mongodb如何查询内嵌数组的指定元素?

将 MongoDB 查询转换为雪花