【发布时间】:2017-02-22 14:50:32
【问题描述】:
我正在尝试将 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' }
非常感谢任何帮助。
【问题讨论】:
标签: node.js mongodb express mongoose aggregation-framework