@NarkoMan01

Как получить часть документа mongodb?

Здравствуйте!
Хочу получить часть документа , а именно объект "B009"

пытался через:
db.subjects.findOne({'ФизМат.Педагогические науки.B183.code':"B183"})
а в ответ получал весь документ(

"ГеоБио": {
  "Педагогические науки": {
    "B001": {
      "code": "B001",
      "name": "Педагогика и психология",
      "max": " 140",
      "min": " 97",
      "minWithQuota": " 91"
    }
  }
},
"ФизМат": {
  "Педагогические науки": {
    "B009": {
      "code": "B009",
      "name": "Подготовка учителей математики",
      "max": "140",
      "min": " 107",
      "minWithQuota": " 95"
    },
    "B183": {
      "code": "B183",
      "name": "Агроинженерия",
      "max": "140",
      "min": " 50",
      "minWithQuota": "none",
      "quotes": []
    }
  }
}
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
@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"
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы