MongoDB - как запросить вложенный элемент внутри коллекции?
у меня есть некоторые данные, что выглядит так:
[
{
"_id" : ObjectId("4e2f2af16f1e7e4c2000000a"),
"advertisers" : [
{
"created_at" : ISODate("2011-07-26T21:02:19Z"),
"category" : "Infinity Pro Spin Air Brush",
"updated_at" : ISODate("2011-07-26T21:02:19Z"),
"lowered_name" : "conair",
"twitter_name" : "",
"facebook_page_url" : "",
"website_url" : "",
"user_ids" : [ ],
"blog_url" : "",
},
и я думал, что такой запрос даст идентификатор рекламодателя:
var start = new Date(2011, 1, 1);
> var end = new Date(2011, 12, 12);
> db.agencies.find( { "created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , advertisers { name : 1 } } ).limit(1).toArray();
но мой запрос не работает. Есть идеи, как я могу добавить поля внутри вложенных элементов в список полей, которые я хочу получить?
спасибо!
3 ответа:
использовать точечную нотацию (например,
advertisers.name
) для запроса и извлечения полей из вложенного объекта:db.agencies.find({ "advertisers.created_at": { $gte: start, $lt: end } }, { _id: 1, program_ids: 1, "advertisers.name": 1 } }).limit(1).toArray();
ссылки: получение подмножества полей и Точку
db.agencies.find( { "advertisers.created_at" : {$gte : start , $lt : end} } , { program_ids : 1 , advertisers.name : 1 } ).limit(1).pretty();
есть одна вещь, называемая точечной нотацией, которую предоставляет MongoDB, которая позволяет вам заглядывать внутрь массивов элементов. С его помощью также просто, как добавление точки для каждого массива, который вы хотите ввести.
в вашем случае
"_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), "advertisers" : [ { "created_at" : ISODate("2011-07-26T21:02:19Z"), "category" : "Infinity Pro Spin Air Brush", "updated_at" : ISODate("2011-07-26T21:02:19Z"), "lowered_name" : "conair", "twitter_name" : "", "facebook_page_url" : "", "website_url" : "", "user_ids" : [ ], "blog_url" : "", }, { ... }
Если вы хотите войти в массив рекламодателей, чтобы найти свойство created_at внутри каждого из них, вы можете просто написать запрос со свойством {'рекламодателей.created_at': query} как следует
db.agencies.find( { 'advertisers.created_at' : { {$gte : start , $lt : end} ... }