Запрос MongoDB / Mongoose, чтобы узнать, существует ли идентификатор в другом документе, если существует, добавьте флаг в результат

#mongodb #mongoose #mongodb-query #aggregation-framework

#mongodb #mongoose #mongodb-запрос #aggregation-framework

Вопрос:

Определение проблемы:

У нас есть 2 коллекции User (где хранятся пользовательские данные) и UserTransactions (где хранятся транзакции, выполняемые пользователями). У пользователей есть 2 usertypes «родителя» и «учащиеся».

Схема пользователя

 {
    _id : ---
    name : String
    usertype : String // parent/student
    studententity : [] // It will store _id of related students from same document
}
 

Схема пользовательских транзакций

 {
    _id : ---
    ref_id: // id of parent who is doing transaction
}
 

Нам нужно получить данные, состоящие из

  1. список всех родителей
  2. список учащихся под родительским
  3. если родитель выполнил «любую» транзакцию.

Мы можем легко получить 1-е и 2-е условие, выполнив запрос

 User.find({ "usertype": { $eq: "parent" } })
    .populate("studententity")
 

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

Мой ожидаемый результат выглядит так

 {
    "usertype": "parent",
    "studententity": [
        {
            "usertype": "student",
            "_id": "5f8a6d0900e0030c7031d56a",
            "name": "Adya"
        },
        { 
            "usertype": "student",
            "_id": "5f9bb96fdf44b931b40c6043",
            "name": "Aruja"
        }
    ],
    transactionflag : true // a flag that signifies transaction is done 
}
 

Ответ №1:

$lookup и $addFields для получения желаемого результата можно использовать этапы.

 db.user.aggregate([
  {
    "$lookup": {
      "from": "transaction",
      "localField": "_id",
      "foreignField": "ref_id",
      "as": "transactionflag"
    }
  },
  {
    "$addFields": {
      "transactionflag": {
        $toBool: {
          $size: "$transactionflag"
        }
      }
    }
  }
])
 

https://mongoplayground.net/p/j0lL4uCgCtA