У меня есть веб-api, написанный с использованием expressjs и mongoosejs.ExpressJS и MongooseJS: могу ли я запрашивать значения массива в поддоку?
Основная схема приложения содержит поддокумент, permissions
, который содержит поля массива. Эти массивы содержат идентификаторы пользователей, которые могут выполнять действие над этим документом.
Я пытаюсь ограничить результаты запроса по этой коллекции с помощью значений в поле массива read
поддокумента:
Вот основная схема:
var MainSchema = new Schema({
uri: { type: String, required: false },
user: { type: String, required: false },
groups: [String],
tags: [String],
permissions: {
read: [String],
update: [String],
delete: [String]
}
});
Я хочу вернуть документы, которые конкретное значение в массиве permissions.read
или где этот массив пуст.
Мой код не вызывает ошибку, но не ограничивает результаты; Я все еще получаю документы, которые не соответствуют данному значению, и не являются пустыми.
Вот что я получил:
var MainModel = mongoose.model('MainSchema', MainSchema);
app.get('/api/search', function (req, res) {
var query = MainModel.find({'uri': req.query.uri });
// This works fine
if (req.query.groups) {
query.where('groups').in(req.query.groups);
}
else if (req.query.user) {
query.where('user').equals(req.query.user);
}
// How can I return only documents that match req.query.user or ""?
query.where('permissions.read').in([req.query.user, ""]);
query.exec(function (err, results) {
if (!err) {
return res.send(results);
} else {
return console.log(err);
}
});
});
У меня есть подозрение, что положение where
не тестирует значение каждого из элементов permissions.read
против каждого из значений массива, переданного в in
пункт.
Спасибо.
РЕДАКТИРОВАТЬ: Вот документ, который не должен быть возвращен, но это (обратите внимание, permissions.read массив включает в себя значение, которое не идентификатор текущего пользователя):
{
"user": "[email protected]",
"uri": "http://localhost:3000/documents/test",
"permissions": {
"delete": [
"[email protected]"
],
"update": [
"[email protected]"
],
"read": [
"[email protected]"
]
},
"tags": [],
"groups": [
"demo",
"2013"
]
}
EDITED: исправлена Модель/схема путаницы, которая не была в моем коде, но была оставлена в копии/вставке. Благодарю.
Вы имеете в виду пустой массив ('permissions: []') или массив, содержащий пустую строку ('permissions: ['']')? Можете ли вы изменить свой вопрос, чтобы включить пример, который возвращается, который не должен? – JohnnyHK
@JohnnyHK done - обратите внимание на схему subdoc разрешений, которая, как я думаю, я неправильно обрабатываю - это subdoc, с полями, каждый из которых представляет собой массив строк. Строки - это то, что я хочу проверить против допустимых значений. Благодарю. – Jamie
Я предполагаю, что вы переписываете 'MainSchema' ссылку на модель вместо схемы? Кроме этого все выглядит отлично, и, к сожалению, я не могу воспроизвести проблему с этим документом. Он исключается из результатов, если я не установил 'req.query.user =" [email protected] "'. – JohnnyHK