mongodb $ match和$ nin与_id

时间:2019-03-03 13:47:06

标签: mongodb mongoose

我的代码:

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一起使用才能省略不需要的文档?

1 个答案:

答案 0 :(得分:3)

_id通常在mongoDb中是一个ObjectId,它是24个字符的十六进制唯一密钥。

您可以将字符串_id转换为ObjectId,然后查询

[{"$match":{"_id":{"$nin":[ObjectId("5c7bb1d08f999f326151df49"),ObjectId("5c7bb1d08f999f326151df49")]},"category":{"$in":["Test"]}}},{"$sample":{"size":1}}]