Как извлечь данные из вложенного json в mongodb, когда ключ неизвестен(переменная)

#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