私は(Mongooseを使用して)照会している「アクティビティ」と呼ばれるモデルを持っています。それらのスキーマは次のようになります。
var activitySchema = new mongoose.Schema({
actor: {
type: mongoose.Schema.ObjectId,
ref: 'User',
required: true
},
recipient: {
type: mongoose.Schema.ObjectId,
ref: 'User'
},
timestamp: {
type: Date,
default: Date.now
},
activity: {
type: String,
required: true
},
event: {
type: mongoose.Schema.ObjectId,
ref: 'Event'
},
comment: {
type: mongoose.Schema.ObjectId,
ref: 'Comment'
}
});
それらを照会するとactor
、 、recipient
、event
、およびcomment
フィールド (すべての参照) にデータが入力されます。その後、取得するevent
フィールドにもディープ ポピュレートしますevent.creator
。クエリのコードは次のとおりです。
var activityPopulateObj = [
{ path: 'event' },
{ path: 'event.creator' },
{ path: 'comment' },
{ path: 'actor' },
{ path: 'recipient' },
{ path: 'event.creator' }
],
eventPopulateObj = {
path: 'event.creator',
model: User
};
Activity.find({ $or: [{recipient: user._id}, {actor: {$in: user.subscriptions}}, {event: {$in: user.attending}}], actor: { $ne: user._id} })
.sort({ _id: -1 })
.populate(activityPopulateObj)
.exec(function(err, retrievedActivities) {
if(err || !retrievedActivities) {
deferred.reject(new Error("No events found."));
}
else {
User.populate(retrievedActivities, eventPopulateObj, function(err, data){
if(err) {
deferred.reject(err.message);
}
else {
deferred.resolve(retrievedActivities);
}
});
}
});
これはすでに比較的複雑なクエリですが、さらに多くのことを行う必要があります。$or
というステートメントの部分にヒットした場合は{actor: {$in: user.subscriptions}}
、'sフィールドが文字列と等しいことも確認する必要があります。を使用してみましたが、最初にイベントを入力する必要があるため、そのフィールドを照会できませんでした。他の複数のクエリでも同じ目標を達成する必要があります。event
privacy
public
$elemMatch
私が説明したように、このさらなるフィルタリングを実現する方法はありますか?