Монго найти, только если каждый элемент соответствует условию - PullRequest
2 голосов
/ 02 июня 2019

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

на данный момент похоже, что если хотя бы одна коллекция успешно соответствует одному из этих условий, она мне возвращается.

вот образец коллекции

"resa": [
    {
        "_id": "5cf2a38372373620263c84f1",
        "start": "2019-06-01T15:23:00.000Z",
        "end": "2019-06-01T16:23:00.000Z"
    },
    {
        "_id": "5cf2a3a772373620263c84f2",
        "start": "2022-03-05T16:23:00.000Z",
        "end": "2022-03-05T17:23:00.000Z"
    }
]

и вот моя попытка до сих пор

$or: [
        { resa: { $all: [{ $elemMatch: { start: { $lt : req.query.start }, end: { $lt : req.query.start } } } ]} },
        { resa: { $all: [{ $elemMatch: { start: { $gt : req.query.end }, end: { $gt : req.query.end } } } ]} }
      ],

исходя из ответа Микла, я пробовал вот так, но он не дал результатов

  Post.find({ 
      capacity: { $gte : req.query.capacity },
      $expr: {
        $allElementsTrue: {
            $map: {
                input: "$resa",
                in: {
                    $or: [
                      {
                        $and: [
                          { $gte: [ "$$this.start", req.query.end ] },
                          { $gte: [ "$$this.end", req.query.end ] }
                        ]
                      },
                      {
                        $and: [
                          { $te: [ "$$this.start", req.query.start ] },
                          { $lte: [ "$$this.end", req.query.start ] }
                        ]
                      },
                      { resa: [] },
                  ]
                }
            }
        }
    }
    },

Я также попытался отменить запрос, обнаружив, что коллекция НЕ соответствует условию, что означает, что они не будут доступны в указанный период

      resa: {
        $elemMatch: { 
          $not: { 
            $or: [
              {
                $and: [
                { start: { $gte : req.query.start }},
                { start: { $lte : req.query.end } }]
              },
              {
                $and: [
                  { end: { $lte : req.query.end }},
                  { end: { $gte : req.query.start } }]
              },
            ],
          },
        },
      },

1 Ответ

1 голос
/ 02 июня 2019

Мне удалось найти решение:

      resa: {
        $not: {
          $elemMatch: {
            $or: [
              {
                $and: [
                { start: { $gte : req.query.start }},
                { start: { $lte : req.query.end } }]
              },
              {
                $and: [
                  { end: { $gte : req.query.start }},
                  { end: { $lte : req.query.end } }]
              },
              {
                $and: [
                  { start: { $gte : req.query.start }},
                  { end: { $lte : req.query.end } }]
              },
              {
                $and: [
                  { start: { $lte : req.query.start }},
                  { end: { $gte : req.query.end } }]
              },
            ],
          },
        },
      },

важная часть, которую нужно понять, это сборка

      resa: {
        $not: {
          $elemMatch: {
            $or: [
              {
                $and: [
                  { x: y},
                  { x: y }]
              },
              {
                $and: [
                  { x: y},
                  { x: y }]
              },
...

, которая немного сбивает с толку в значении: «я хочу найти всю коллекцию, которая не соответствует {this и this} или {that и that} "

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