Ответ 1
Вы могли бы сделать
db.collection.find({},{'info.x':1, 'info.y':1})
но это означает перечисление каждого объекта информационного объекта в проекции, что может быть или не быть тем, что вы ищете.
Я пробую Mongo db, и мне интересно, возможно ли получить только определенную часть документа?
Например у меня есть:
{
"name" : "MongoDB",
"info" : { x : 203, y : 102 }
}
и я хочу только содержание info
.
Самое близкое, что я нашел, это db.collection.find({}, { info: 1 })
но это возвращает меня { "info": { x: 203, y: 102 } }
когда мне нужно только { x: 203, y: 102 }
.
Вы могли бы сделать
db.collection.find({},{'info.x':1, 'info.y':1})
но это означает перечисление каждого объекта информационного объекта в проекции, что может быть или не быть тем, что вы ищете.
Вы можете использовать функцию distinct()
, которая выглядит следующим образом:
db.collection.distinct("info", {info : {$exists : true}})
Нет, вы не можете вернуть только значения для x/y; даже если вы ограничиваете поля, внешняя структура все еще возвращается.
Подробнее см. Результаты проекта.
прочитайте это
в этом случае, если вы указали отсутствие проекции, метод find() возвращает все поля всех документов, соответствующих запросу.
Вы можете использовать структуру агрегации:
$фаза проекта для выбора полей
db.getCollection('yourCollection').aggregate([
{$match:{_id:ObjectId("566fc97f5b79dff1a73ca2ae")}},
{$project:{_id:0, "x":"$info.x", "y":"$info.y"}}
])
Начиная с 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" } })