Подтвердить что ты не робот

Получить конкретную часть документа

Я пробую Mongo db, и мне интересно, возможно ли получить только определенную часть документа?

Например у меня есть:

{
  "name" : "MongoDB",
  "info" : { x : 203, y : 102 }
}

и я хочу только содержание info.

Самое близкое, что я нашел, это db.collection.find({}, { info: 1 }) но это возвращает меня { "info": { x: 203, y: 102 } } когда мне нужно только { x: 203, y: 102 }.

4b9b3361

Ответ 1

Вы могли бы сделать

db.collection.find({},{'info.x':1, 'info.y':1})

но это означает перечисление каждого объекта информационного объекта в проекции, что может быть или не быть тем, что вы ищете.

Ответ 2

Вы можете использовать функцию distinct(), которая выглядит следующим образом:

db.collection.distinct("info", {info : {$exists : true}})

Ответ 3

Нет, вы не можете вернуть только значения для x/y; даже если вы ограничиваете поля, внешняя структура все еще возвращается.

Подробнее см. Результаты проекта.

Ответ 4

Документы MongoDb

прочитайте это

в этом случае, если вы указали отсутствие проекции, метод find() возвращает все поля всех документов, соответствующих запросу.

Ответ 5

Вы можете использовать структуру агрегации:

  • $фаза соответствия (необязательно) для фильтрации результата.
  • $фаза проекта для выбора полей

    db.getCollection('yourCollection').aggregate([ {$match:{_id:ObjectId("566fc97f5b79dff1a73ca2ae")}}, {$project:{_id:0, "x":"$info.x", "y":"$info.y"}} ])

Ответ 6

  • Начиная с Mongo 4.2, оператор агрегации $replaceWith можно использовать для замены документа другим (в нашем случае вложенным документом):

    // { name: "MongoDB", info: { x: 203, y: 102 } }
    db.collection.aggregate({ $replaceWith: "$info" })
    // { "x" : 203, "y" : 102 }
    
  • До Mongo 4.2 и запуска Mongo 3.4 можно использовать $replaceRoot вместо $replaceWith:

    db.collection.aggregate({ $replaceRoot: { newRoot: "$info" } })