MongoDB Если условие как второе поле в gt - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу выбрать поле $user_a_seen_at, если $user_a_id == socket.user_id, в противном случае выберите поле $user_b_seen_at. Но мой запрос не работает.

$gt: ["$$this.created_at", IF CONDITION TO SELECT A FIELD ]

$project: {
    unread_messages: {
        $size: {
            $filter: {
                input: "$messages",
                cond: {
                    $and: [
                        { $eq: ["$$this.to_id", socket.user_id] },
                        {
                            $gt: [
                                "$$this.created_at", {
                                    if: { $eq: ["$user_a_id", socket.user_id] },
                                    then: "$user_a_seen_at",
                                    else: "$user_b_seen_at"
                                }
                            ] 
                        }
                    ]
                }
            }
        }
    }
}

Пример данных

{
   "_id" : ObjectId("5e4c57649fad2e2cac9f8cd5"),
   "user_a_id" : 1,
   "user_b_id" : 2,
   "user_a_seen_at" : ISODate("2020-02-18T21:30:12.418Z"),
   "user_b_seen_at" : ISODate("2020-02-18T15:30:12.418Z"),
   "messages" : [
                {
                        "text" : "Hello",
                        "_id" : ObjectId("5e4c57649fad2e2cac9f8cd4"),
                        "from_id" : 1,
                        "to_id" : 2,
                        "created_at" : ISODate("2020-02-18T21:30:12.409Z")
                }
        ],
    "created_at" : ISODate("2020-02-18T21:30:12.418Z"),
    "last_activity" : ISODate("2020-02-18T21:30:12.418Z"),
    "__v" : 0
}

1 Ответ

1 голос
/ 19 февраля 2020

Вам нужно использовать оператор $ cond , чтобы вычислить логическое выражение для возврата одного из двух указанных выражений возврата

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }
//or simplified
{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

db.collection.aggregate([
  {
    $project: {
      unread_messages: {
        $size: {
          $filter: {
            input: "$messages",
            cond: {
              $and: [
                {
                  $eq: [
                    "$$this.to_id",
                    socket.user_id
                  ]
                },
                {
                  $gt: [
                    "$$this.created_at",
                    {
                      $cond: [
                        {
                          $eq: [
                            "$user_a_id",
                            socket.user_id
                          ]
                        },
                        "$user_a_seen_at",
                        "$user_b_seen_at"
                      ]
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    }
  }
])

MongoPlayground

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