2013-02-22 1 views
1

У меня есть веб-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: исправлена Модель/схема путаницы, которая не была в моем коде, но была оставлена ​​в копии/вставке. Благодарю.

+0

Вы имеете в виду пустой массив ('permissions: []') или массив, содержащий пустую строку ('permissions: ['']')? Можете ли вы изменить свой вопрос, чтобы включить пример, который возвращается, который не должен? – JohnnyHK

+0

@JohnnyHK done - обратите внимание на схему subdoc разрешений, которая, как я думаю, я неправильно обрабатываю - это subdoc, с полями, каждый из которых представляет собой массив строк. Строки - это то, что я хочу проверить против допустимых значений. Благодарю. – Jamie

+0

Я предполагаю, что вы переписываете 'MainSchema' ссылку на модель вместо схемы? Кроме этого все выглядит отлично, и, к сожалению, я не могу воспроизвести проблему с этим документом. Он исключается из результатов, если я не установил 'req.query.user =" [email protected] "'. – JohnnyHK

ответ

3

Я искал и не нашел пример запроса mongodb/mongoose, который проверяет либо для указанного значения в поле массива поддокумента, либо в поле пустого массива.

Вместо этого, поскольку я управляю как API (из которого этот код исходит), так и клиентским приложением, я реорганизую.

Я теперь добавить один из трех where положений в запросе, на основе выбора пользователя на стороне клиента:

if (req.query.mode === 'user') { 
    query.where('user').equals(req.query.user); 
} 
else if (req.query.mode === 'group') { 
    query.where('groups').in(req.query.groups); 
    query.$where('this.permissions.read.length === 0'); 
} 
else if (req.query.mode === 'class') { 
    query.$where('this.permissions.read.length === 0'); 
} 

Спасибо за ваш вклад, @JohnnyHK.

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