私はMongoDB集約をRESTfulなapiに利用しようとしていますが、次の場合には固執しています。サブスクリプションがアクティブになっている、またはユーザーのキャンセルアクションのDate
になった場合に、このcancelled
プロパティは、undefined
のいずれかになります
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var SubscriptionSchema = new Schema({
// ...
cancelled: Date
});
:私はこのようになりますSubscriptions
モデルを、持っている、と仮定します。
今、サブスクリプションを集約し、オプションのクエリパラメータcancelled=true
(表示のみキャンセル)またはcancelled=false
(表示のみ有効)を持つルートGET /me/subscriptions
があります。指定されていない場合は、サブスクリプション(アクティブまたはキャンセル)を返します。
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
唯一の解決策は、今見ているといないタイプDate
のundefined
ない値と比較する、このようなものです、それはあまりにもハッキリと思われる。
cancelled: { $ne: 'some-impossible-value' }
助けを非常に感謝します。
解決方法は間違いありませんが、簡潔にするために、「if-then-else」を避けるようにしました。ありがとう。 –
私はあなたの答えを@chridamのものと組み合わせました: 'var match = {user:req.user._id}; (['true'、 'false'] .indexOf(req.query.cancelled)!== -1)match.cancelled = {$ exists:JSON.parse(req.query.cancelled)}; ' –