#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-е условие, выполнив запрос
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"
}
}
}
}
])