mongodb - игнорировать документ, если один из элементов в массиве соответствует запросу - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть пользовательский объект в коллекции пользователей, как показано ниже:

{
  "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 голосов
/ 24 декабря 2018

Вы должны использовать оператор запроса $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")
        }
      }
    }
  }
})
0 голосов
/ 24 декабря 2018

Чтобы запросить пользователей, у которых нет ни одного сеанса между диапазонами дат, вам нужно будет запрашивать пользователей, у которых есть сеансы за пределами диапазона дат, а затем запрашивать пользователей, которых нет среди них.В вашем запросе вы получаете пользователей, у которых есть сеансы внутри диапазона дат, которые действительно возвращают пользователей, у которых есть сеансы внутри диапазона дат и за пределами диапазона дат, и не возвращают пользователей внутри диапазона дат.С точки зрения наборов, давайте рассмотрим

O = "пользователи, имеющие сеансы вне диапазона дат"

I = "пользователи, имеющие сеансы внутри диапазона дат"

A = "все пользователи"

O ∩ I = "пользователи, имеющие сеансы внутри и за пределами диапазона дат"

O ∪ I = "пользователи, имеющие сеансы внутри или за пределами диапазона дат"

Теперь вам нужен

A \ O, и для этого вам нужно найти O, а затем отфильтровать его предметы от A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...