получить проблему с состоянием в mongodb - PullRequest
0 голосов
/ 29 апреля 2020

См., Что мое условие работает нормально для первой коллекции моей истории, но для второго оно также не работает. Если я заменим указанный мной идентификатор на 5e4a8d2d3952132a08ae5724, который существует во втором объекте коллекции истории, вернет мне все данные, которые не верны, потому что его дата больше, чем дата основной коллекции, поэтому она не должна возвращать мне ничего, пожалуйста, предложите, как это исправить.

db.main.aggregate([
  {
    $lookup: {
      from: "history",
      localField: "history_id",
      foreignField: "history_id",
      as: "History"
    }
  },
  {
    $unwind: "$History"
  },
  {
    "$match": {
      $expr: {
        $cond: {
          if: {
            $eq: [
              "5e4a8d2d3952132a08ae5764",
              "$History.user_id"
            ]
          },
          then: {
            $and: [
              {
                $gt: [
                  "$date",
                  "$History.date"
                ]
              },
              {
                $eq: [
                  "5e4a8d2d3952132a08ae5764",
                  "$History.user_id"
                ]
              }
            ]
          },
          else: {}
        }
      }
    }
  }
])

когда я помещаю два объекта в коллекцию истории, он тоже не работает MongoPlayground

Здесь работает игровая площадка с одним объектом истории https://mongoplayground.net/p/hrNofrq1c3S

1 Ответ

1 голос
/ 29 апреля 2020

Причина, по которой ваш запрос (который размещен в OP) не работает, потому что вы ничего не указали в части else. Таким образом, лучший подход будет с оператором '$ filter'.

Вы можете попробовать следующее:

db.main.aggregate([
  {
    $lookup: {
      from: "history",
      localField: "history_id",
      foreignField: "history_id",
      as: "History"
    }
  },
  {
    $project: {
      "History": {
        $filter: {
          input: "$History",
          as: "his",
          cond: {
            $and: [
              {
                $lt: [
                  "$$his.date",
                  "$date"
                ]
              },
              {
                $eq: [
                  "5e4a8d2d3952132a08ae5764",
                  "$$his.user_id"
                ]
              }
            ]
          }
        }
      },
      data: 1,
      history_id: 1,
      sender_id: 1,
      text: 1,
      date: 1
    }
  },
  {
    $unwind: "$History"
  }
])

MongoPlayGroundLink

...