#node.js #json #mongodb #express
Вопрос:
Как мне получить список пользователей, которые достигли целей, т. е. целей.goalid.IsComplete == true.Здесь идентификатор цели является переменной и неизвестен. Извлеките такие сведения, как [идентификатор цели, очки].Запрос Mongodb для nodejs с помощью express.
Это работает в оболочке mongo,но не из express, и я не могу получить необходимые атрибуты (идентификатор цели, очки).
db.tablename.find({$where: function() {for(var key in this.goals) {if (this.goals[key].isComplete == true) return true; }return false; }});
Ниже приведены данные таблицы(одна строка)
{
"_id": ObjectId("60fe7d8d48406eb3c8f6c3e5"),
"entityId": "abc",
"goals": {
"60fe7a9c793a7a7bb141715f": {
"isComplete": true,
"criteriaIds": {
"60fe7a9c793a7a7bb1417160": {
"isComplete": true,
"value": 5,
"completionDate": 1627361639350
}
},
"pointsAwarded": 100,
"completionDate": 1627361639350
},
"60fe7aaa793a7a7bb1417169": {
"isComplete": true,
"criteriaIds": {
"60fe7aaa793a7a7bb141716a": {
"isComplete": true,
"value": 101,
"completionDate": 1627361527428
}
},
"pointsAwarded": 50,
"completionDate": 1627361527428
},
"60ff907855b1412e4f087b64": {
"isComplete": true,
"criteriaIds": {
"60ff907955b1412e4f087b65": {
"isComplete": true,
"value": 101,
"completionDate": 1627361527428
}
},
"pointsAwarded": 50,
"completionDate": 1627361527429
}
},
"points": 200
}
Комментарии:
1. Вы можете попробовать выполнить запрос агрегации с помощью
$objectToArray
оператора.
Ответ №1:
Попробуйте использовать это
db.collection.aggregate([
{
$project: {
_id: 0,
goals: {
$objectToArray: "$goals"
}
}
},
{
$unwind: "$goals"
},
{
$match: {
"goals.v.isComplete": true
}
},
{
$project: {
goalid: "$goals.k",
points: "$goals.v.pointsAwarded",
},
}
])
Результатом будет
[
{
"goalid": "60ff907855b1412e4f087b64",
"points": 50
},
{
"goalid": "60fe7a9c793a7a7bb141715f",
"points": 100
},
{
"goalid": "60fe7aaa793a7a7bb1417169",
"points": 50
}
]
Попробуйте mongoplayground