$ match expr в том же документе не работает - PullRequest
0 голосов
/ 28 апреля 2020

Как преобразовать данные, используя условие $ if $ else MongoDB

mongoPlayground

Я получаю худшее копание в $, если условие $ expr

Эта игровая площадка не должна ничего возвращать, потому что date - это $ gt, а не основная коллекция, но она возвращает мне данные.

Таким образом, условие должно указывать, что если в истории указана $ gt, то основная коллекция не должна возвращать ничего, кроме данных соответствующих критериев.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Если я не ошибаюсь, я думаю, это то, что вы ожидаете: -

db.main.aggregate([
  {
    $lookup: {
      from: "history",
      localField: "history_id",
      foreignField: "_id",
      as: "History"
    }
  },
  {
    $unwind: "$History"
  },
  {
    "$match": {
      $expr: {
        $and: [
          {
            $eq: [
              "$_id",
              "$History.user_id"
            ]
          },
          {
            $gt: [
              "$date",
              "$Histoy.date"
            ]
          }
        ]
      }
    }
  }
])

Что ж, для удовлетворения ваших потребностей может потребоваться несколько модификаций.

0 голосов
/ 28 апреля 2020

используется только первая history запись, так как она имеет _id в main в коллекции *1004*

, поэтому при проверке первого документа истории

{
  "_id": ObjectId("5e4e755b380054797d9db627"),
  "user_id": "5e4e74eb380054797d9db625",
  "history_id": ObjectId("5e4e755b380054797d9db627"),
  "date": 1587650683433,
  "__v": 1
}

и ваш запрос

db.main.aggregate([
  {
    $lookup: {
      from: "history",
      localField: "history_id",
      foreignField: "_id",
      as: "History"
    }
  },
  {
    $unwind: "$History"
  },
  {
    "$match": {
      $expr: {
        $cond: {
          if: {
            $eq: [
              "5e4e74eb380054797d9db623",
              "$History.user_id"
            ]
          },
          then: {
            $and: [
              {
                $gt: [
                  "$date",
                  "$History.date"
                ]
              },
              { // also, this part has no meaning as the same condition is used in the if part
                $eq: [
                  "5e4e74eb380054797d9db623",
                  "$History.user_id"
                ]
              }
            ]
          },
          else: {}
        }
      }
    }
  }
])

условие if не выполнено, так как user_id в исторической модели "5e4e74eb380054797d9db625" не равен указанному id "5e4e74eb380054797d9db623"

, поэтому , он переходит к другой части, которая получает все документы в main коллекции

примечание: я добавил некоторый комментарий в запрос, не могли бы вы также проверить это?

...