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

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();

Но мой запрос не сработал. Любая идея, как я могу добавить поля внутри вложенных элементов в список полей, которые хочу получить?

Спасибо!

4b9b3361

Ответ 1

Используйте точечную нотацию (например, advertisers.name) для запроса и получения полей из вложенных объектов:

db.agencies.find( { "advertisers.created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , "advertisers.name": 1 }  } ).limit(1).toArray();

Ссылка: Получение подмножества полей и Точечная нотация

Ответ 2

db.agencies.find( 
{ "advertisers.created_at" : {$gte : start , $lt : end} } , 
{ program_ids : 1 , advertisers.name : 1   } 
).limit(1).pretty();

Ответ 3

Есть одна вещь, называемая точечной нотацией, которую предоставляет 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 внутри каждого из них, вы можете просто написать запрос с помощью свойства {' advertisers.created_at: query} как следует

db.agencies.find( { 'advertisers.created_at' : { {$gte : start , $lt : end} ... }