Ответы пользователя по тегу Node.js
  • Как получить часть документа mongodb?

    @Asapin
    В свободное время ковыряюсь с Rust и Wasm
    Для этой задачи вам надо использовать проекцию. Их в монге несколько видов:

    1. Используется в запросах find, findOne, findOneAndDelete, findOneAndReplace и findOneAndUpdate
    2. Используется для фильтрации элементов массива
    3. Используется как отдельная стадия аггрегации


    1 тип аггрегации позволяет только скрыть лишние элементы из ответа. Если воспользоваться этим типом, то запрос будет выглядеть вот так:
    db.subjects.find(
    	{"ФизМат.Педагогические науки.B009": {$exists: true}}, // Из всех документов (если у вас их несколько, а не один огромный документ), выбрать те, у которых существует поле "ФизМат.Педагогические науки.B009"
    	{
    		_id: 1, // У найденного документа вернуть только поле _id
    		"ФизМат.Педагогические науки.B009": 1 // и поле "ФизМат.Педагогические науки.B009"
    	}
    )


    Ответ на такой запрос:
    {
      "_id": ObjectId("600fa6f3101fa920a8575e6f"),
      "ФизМат": {
        "Педагогические науки": {
          "B009": {
            "code": "B009",
            "name": "Подготовка учителей математики",
            "max": "140",
            "min": " 107",
            "minWithQuota": " 95"
          }
        }
      }
    }


    т.е. будут скрыты все поля, кроме _id и ФизМат.Педагогические науки.B009, никаких дополнительных преобразований над документом проводиться не будет.

    2 тип используется что бы из массива выбрать только первое подходящее значение, но у вас предметы оформлены не в виде массива документов, поэтому этот тип пропустим.

    3 тип - как стадия аггрегации. Аггрегация в монге - довольно мощный инструмент, который позволяет группировать результаты, преобразовывать их, делать многоуровневый поиск и т.п.
    В данном случае сам запрос будет выглядеть совершенно по другому:
    db.subjects.aggregate(
    [
      { 
        $match: { // Эта стадия ищет документы, подходящие под условие
          "ФизМат.Педагогические науки.B009": {$exists: true} // В документе есть поле "ФизМат.Педагогические науки.B009"
        } 
      },
      { 
        $project: { // Стадия проекции
          _id: 1, // Вернуть id документа
          value: "$ФизМат.Педагогические науки.B009" // Вернуть embedded документ в поле value
        }
      },
    ])


    Ответ в таком случае будет выглядеть вот так:
    {
      "_id": ObjectId("600fa6f3101fa920a8575e6f"),
      "value": {
        "code": "B009",
        "name": "Подготовка учителей математики",
        "max": "140",
        "min": " 107",
        "minWithQuota": " 95"
      }
    }
    Ответ написан
    1 комментарий