Могу ли я сделать запрос в возвращенном документе с помощью mongoose? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть такая схема ...

var TerritorySchema = new Schema({
    user: Schema.Types.ObjectId,
    streets: [streets_schema]
)};

var StreetsSchema = new Schema({
    name: String,
    odd: [block_schema],
    even: [block_schema],
    tags: [String]
)};

Необходимо иметь возможность найти территорию по идентификатору пользователя.Однако затем мне нужно найти улицу по названию в пределах улиц внутри возвращенного документа.Вот как я это делаю ...

TerritoryModel.findOne({user: userId})
    .then(territory => {
        // now i have my territory parent object
        // and must find street by name
        var streetINeedToFind = null;
        for(i = 0; i < territory.streets.length; i++){
            var street = territory.streets[i];
            if(street.name === streetNameToFind){
                streetINeedToFind = street;
                break;
            }
         }
    })
    // catch blah blah blah ... you know

Я новичок в сцене NoSQL, и я просто чувствую, что должен иметь возможность запросить нужную мне улицу, и база данных сделает всепоиск меня.

Схема территории на самом деле намного больше, чем я определил выше, и мне нужно будет запросить более глубоко вложенные поддокументы (например, дом на улице и т. д.).Есть ли способ сделать запрос в документе или какой-то другой более простой способ раскрытия вложенных документов, а не циклически просматривать их?

Я прочитал об агрегации, но не уверен, что это то, что мне нужно?Я могу ошибаться, может, то, что я делаю, - это лучшая практика, может, кто-нибудь, пожалуйста, покажет мне путь?

1 Ответ

0 голосов
/ 12 декабря 2018

Если вы уже запросили полный документ, вы можете напрямую использовать стандартные методы массива JS, такие как find:

var streetINeedToFind = territory.streets.find(s => s.name === streetNameToFind);

Однако, если вам нужны только определенныечасти документа, затем вы можете использовать методы проекции запросов из этот другой вопрос , чтобы сделать это.

...