Я пытаюсь использовать агрегацию MongoDB для RESTful api, но застрял в следующем случае. Предположим, у меня есть Subscriptions
модель, которая выглядит следующим образом:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var SubscriptionSchema = new Schema({
// ...
cancelled: Date
});
Это cancelled
свойство может быть либо undefined
, если подписка активна, или стать Date
штемпеля действия пользователя.
Теперь у меня есть маршрут GET /me/subscriptions
, который объединяет подписки и имеет необязательный параметр запроса: cancelled=true
(только для отмены) или cancelled=false
(активны только для отображения). Если не указано, следует вернуть любую подписку (активную или отмененную).
var express = require('express'),
router = express.Router(),
Subscription = require('../../models/subscription');
router.get('/me/subscriptions', function(req, res, next) {
var cancelled = req.query.cancelled === 'true' ? { $exists: true } :
req.query.cancelled === 'false' ? { $exists: false } :
{ $exists: { $or: [ true, false ] } }; // wrong logic here
return Subscription.aggregate([
{ $match: { user: req.user._id, cancelled: cancelled }},
{ $project: {
// ...
}}
])
.exec()
// ...
});
module.exports = router;
Он отлично работает, если я прохожу упомянутый выше параметр запроса, но не может найти модели, если не указан параметр (или если он не равен ни true
или false
). Я пробовал много вещей, а не ту строчку (в $match
трубопровода):
cancelled: {}
cancelled: void 0
cancelled: { $exists: { $or: [ true, false ] } }
cancelled: { $exists: { $in: [ true, false ] } }
cancelled: { $exists: [ true, false ] } // obviously wrong, but hey
cancelled: null // obviously wrong, too
cancelled: { $or: [ { $exists: false }, { $exists: true } ] } // can't use $or here, but still, hey
Единственное решение сейчас видите что-то вроде этого, по сравнению со значением, которое не является undefined
, а не типа Date
, но это кажется слишком хриплым.
cancelled: { $ne: 'some-impossible-value' }
Любая помощь очень ценится.
Решение все в порядке, но я старался избегать этого 'if-then-else' материала ради краткости. Благодарю. –
Я объединил свой ответ с именем из @chridam: 'var match = {user: req.user._id}; if (['true', 'false'] .indexOf (req.query.cancelled)! == -1) match.cancelled = {$ существует: JSON.parse (req.query.cancelled)}; ' –