2012-02-11 3 views
0

Я только что начал создавать небольшое приложение с использованием MongoDB и не могу найти примеров, где я могу добавлять объекты в глубокий массив, который затем я могу найти на индивидуальной основе.Добавление объектов в глубокий массив в MongoDB

Позвольте мне проиллюстрировать следующий набор шагов, которые я беру, а также код, который я написал.

создать простой объект в MongoDB так:

testing = { name: "s1", children: [] }; 
db.data.save(testing); 

Когда я запрашиваю это все выглядит красиво и просто до сих пор:

db.data.find(); 

Какие выходы:

{ 
    "_id" : ObjectId("4f36121082b4c129cfce3901"), 
    "name" : "s1", 
    "children" : [ ] 
} 

Однако , после того, как я обновил массив «children», «нажав» в него объект, я попал в все виды проблем.

Сначала команда обновления, что я бегу:

db.data.update({ name:"s1" },{ 
    $push: { 
    children: { name:"r1" } 
    } 
}); 

Затем, когда я запрашиваю БД:

db.data.find({ 
    children: { name: "r1" } 
}); 

Результаты в:

{ 
    "_id" : ObjectId("4f36121082b4c129cfce3901"), 
    "children" : [ { "name" : "r1" } ], 
    "name" : "s1" 
} 

Который не имеет никакого смысла мне, поскольку я бы ожидал следующее:

{ 
    "name": "r1" 
} 

Есть ли лучший способ вставки данных в MongoDB, чтобы при выполнении запросов я извлекал отдельные объекты, а не все дерево? Или, возможно, лучший способ написать запрос «найти»?

ответ

0

Почему вы ожидаете возврата только части документа? Он возвращает весь документ, если вы не укажете, какие поля вы хотите явно включать или исключать. См. http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

+0

Главным образом из-за того, как работают объекты JSON/BSON, особенно в массивах. Если кто-нибудь скажет: «Найдите мне конкретный комментарий для данного сообщения в блоге», на самом деле нет смысла возвращать сообщение в блоге + все остальные комментарии, но вместо этого только объект комментария. Я нашел ресурс на веб-сайте документации MongoDB, в котором упоминаются разные способы структурирования деревьев, но пока не нашел ничего полезного. –

+0

Используйте эту функцию в ссылке, которую я перечисл, чтобы получить нужные поля. Есть еще много случаев, когда вы хотите получить больше, чем одно найденное поле, чем есть случаи, когда вам нужен только один маленький бит документа, возвращенный в ответ на поиск. –

1

По умолчанию mongodb находит все поля (например, * from в sql). Вы можете извлечь конкретное поле, указав имя поля .

db.data.find({ "children.name": "r1" },'children.name'); 
Смежные вопросы