2015-05-26 2 views
1

У меня есть следующие Mongoose схемы:Запрос Mongoose Документы на основе свойств объекта

var UserSchema = new Schema({ 
    name: String, 
    age: Number, 
    ... 
    tags: [{ 
    text: String, 
    ... 
    }] 
}); 

и следующий массив:

var tagTexts = ['tall', 'small', 'green', 'blue']; 

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

Например, если бы я имел следующие пользователи и tagTexts массив

[{ 
    name: 'Bob', 
    age: 17, 
    ... 
    tags: [{ 
    text: 'small', 
    ... 
    }] 
}, { 
    name: 'Bill', 
    age: 29, 
    ... 
    tags: [{ 
    text: 'dandelion', 
    ... 
    }, { 
    text: 'oak', 
    ... 
    }] 
}] 

var tagTexts = ['tall', 'small', 'green', 'blue']; 

затем Боб будет получен, но не Билл.

ответ

2

Вы можете использовать $in для сопоставления с массивом значений и точечной нотации для задания поля text внутри каждого элемента массива tags. Любое совпадение приведет к включению документа в результаты.

var tagTexts = ['tall', 'small', 'green', 'blue']; 
User.find({'tags.text': {$in: tagTexts}}, function(err, users) {...}); 
+0

спасибо. Я пробовал это раньше, но я использовал неправильный синтаксис, чтобы он не работал. Я обновил свой запрос, чтобы отразить ваше предложение, и я получаю результаты, которые я хотел. Спасибо Спасибо спасибо! – bipvanwinkle

+0

- это хороший способ организовать данные в схеме или это будет неэффективно для поиска через большое количество пользователей/тегов? – pedrotp

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