В примере документа значения «payment» задаются в виде строк, которые могут не работать должным образом с помощью команды $ lt.Для этого ответа я преобразовал их в целые числа.
Запросы с подстановочными знаками невозможны с MongoDB, поэтому при заданной структуре документа ключ (0,1,2 и т. Д.) Поддокумента должен бытьизвестен.Например, следующий запрос будет работать:
> db.test.find({"visits.2.payment":{$lt:35}})
Однако
> db.test.find({"visits.payment":{$lt:35}})
не будет работать в этом случае, и
> db.test.find({"visits.*.payment":{$lt:35}})
также не вернетсялюбые результаты.
Чтобы иметь возможность запрашивать встроенные документы «посещений», вы должны изменить структуру документа и сделать «посещения» массивом или встроенными документами, например:
> db.test2.find().pretty()
{
"_id" : ObjectId("4f16199d3563af4cb141c547"),
"dob" : "10-01-1998",
"name" : "Sam",
"visits" : [
{
"service_date" : "12-5-2011",
"payment" : 30,
"chk_number" : "86786464"
},
{
"service_date" : "12-15-2011",
"payment" : 35,
"chk_number" : "45643461234"
},
{
"service_date" : "12-25-2011",
"payment" : 20,
"chk_number" : "4569821234"
}
]
}
Теперь вы можете запросить все встроенные документы в «посещениях»:
> db.test2.find({"visits.payment":{$lt:35}})
Для получения дополнительной информации, пожалуйста, обратитесь к документации Mongo по точечной записи:
http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
Теперь перейдем ко второй части вашего вопроса: невозможно вернуть только условный поднабор встроенных документов.
При любом формате документа невозможно вернуть документ, содержащий ТОЛЬКОвложенные документы, соответствующие запросу.Если один из вложенных документов соответствует запросу, то весь документ соответствует запросу, и он будет возвращен.
Согласно монго-документу «Извлечение подмножества полей»
http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields
Мы можем вернуть части встроенных документов следующим образом:
> db.test2.find({"visits.payment":{$lt:35}},{"visits.service_date":1}).pretty()
{
"_id" : ObjectId("4f16199d3563af4cb141c547"),
"visits" : [
{
"service_date" : "12-5-2011"
},
{
"service_date" : "12-15-2011"
},
{
"service_date" : "12-25-2011"
}
]
}
Но у нас не может быть условного поиска некоторых поддокументов.Самое близкое, что мы можем получить, это оператор $ slice, но это не является условным, и вам сначала нужно будет узнать местоположение каждого вложенного документа в массиве:
http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements
Чтобы приложение отображало только встроенные документы, соответствующие запросу, это должно быть сделано программно.