2017-02-11 4 views
0

Я пытаюсь запросить MongoDB с помощью Mongoose, чтобы найти документы на основе значения вложенного свойства.Query вложенное свойство в Mongoose (без точечной нотации)

var Obj = new mongoose.Schema({ 
    mainProperty: { 
     nestedProp1: String 
     nestedProp2:String 
    } 
}) 

В связи с тем, как будут получены данные, мне нужно, чтобы выполнить запрос без записи с точками (как показано ниже).

Obj.find({'mainProperty.nestedProp': 'value'}) 

Код выше получите мне правильные результаты, но мне нужно пройти в условиях запроса в указанном ниже формате.

Obj.find({ mainProperty: { nestedProp1: 'value' } }) 

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

Obj.find(queryCondition) 
//queryCondition holds a value of { mainProperty: { nestedProp1: 'value' } } 

Поскольку существует два свойства, вложенные в mainProperty, это недопустимо для выполнения поиска выше. Он будет искать документы, у которых mainProperty точно соответствует тому, что передается в следующем двоеточии (что означает документы, значения которых равны nestedProp1 и не имеют nestedProp2).

Есть ли другой способ назвать это (без точечной нотации или редактирования самого объекта), где он будет запрашивать значение nestedProp1, а не значение mainProperty?

ответ

0

Существует, вы могли бы сделать что-то вроде

const filter = {}; 

// check if you have specified nestedProp1 
if (req.body.nestedProp1) { 
    filter['mainProperty.nestedProp1'] = req.body.nestedProp1; 
} 

if (req.body.nestedProp2) { 
    filter['mainProperty.nestedProp2'] = req.body.nestedProp2; 
} 

// and then 
Obj.find(filter); 

Так что, если вы указали фильтр, вы получите отфильтрованные записи, в противном случае записи по умолчанию.

Я не проверял код, так что если это не работает, вы можете попробовать сделать filter['mainProperty']['nestedProp1'] = req.body.nestedProp1;

+0

Спасибо за ответ! Это, безусловно, чистый способ сделать это в небольшом масштабе, но в реальном приложении у меня есть 8 не вложенных свойств и 5 вложенных свойств. Кроме того, свойства, переданные в запрос каждый раз, будут различаться. Я надеюсь избежать использования большого оператора if, чтобы определить, что используется и преобразовать свойства. Я должен был указать, что у меня есть еще много свойств, когда я задал вопрос, и я ценю помощь! –

0

Вы можете использовать большинство синтаксис Монго DB с Mongoose find(). Попробуйте это:

Obj.find({ mainProperty: { nestedProp1: { $in: ['value'] } } })

Mongo docs

+0

Спасибо за ответ, но цель, не использующая точечную нотацию, заключается в том, что у меня уже есть запрос, сохраненный как объект. Я хочу иметь возможность запрашивать без редактирования объекта, а использование $ in все еще требует от меня входа в объект и внесения изменений. Я уточню вопрос, чтобы уточнить требования. –

 Смежные вопросы

  • Нет связанных вопросов^_^