我的代码:
questionSchema.statics.getRandomByUser = function getRandomByUser(user) {
const aggr = [{ $sample: { size: 1 } }];
console.log(`user.answered = ${user.answered}`);
if (user.answered.length || user.categories.length) {
const match = { $match: {} };
if (user.answered.length) match.$match._id = { $nin: user.answered };
if (user.categories.length) match.$match.category = { $in: user.categories };
aggr.unshift(match);
}
console.log(`aggr = ${JSON.stringify(aggr)}`);
return this.model('question').aggregate(aggr);
};
结果汇总为:
[{"$match":{"_id":{"$nin":["5c7bb1d08f999f326151df49","5c7bb1d08f999f326151df49"]},"category":{"$in":["Test"]}}},{"$sample":{"size":1}}]
按类别过滤可以正常工作。但是我的$nin
只是被忽略了。如何将$nin
与_id
一起使用才能省略不需要的文档?
答案 0 :(得分:3)
_id
通常在mongoDb中是一个ObjectId
,它是24个字符的十六进制唯一密钥。
您可以将字符串_id转换为ObjectId,然后查询
[{"$match":{"_id":{"$nin":[ObjectId("5c7bb1d08f999f326151df49"),ObjectId("5c7bb1d08f999f326151df49")]},"category":{"$in":["Test"]}}},{"$sample":{"size":1}}]