模型的猫鼬搜索关键字以及填充模型

时间:2021-07-08 15:48:49

标签: mongodb mongoose mongoose-populate

我有 2 个模型:

Books.Schema = {
  id,
  name,
  description,
  type: ObjectID(populate to Types.Schema),
}

和 Types.Schema 为:

Types.Schema = {
  id,
  name,
}

我想编写一个函数来获取与“searchKeyWords”匹配的所有书籍。我写了一个这样的函数:

let list = await Books.find({
   $or:[
      {"name": {"$regex": req.query.search}},
      {"description": {"$regex": req.query.search}}
       ]
})
list = await Types.populate(list, {path: "type", model: "Types", select: "id name", options: {lean: true}});

因此,当我输入 searchKeyWord 时,它只会返回包含 book.name 和 book.description 的书籍。我希望它也返回 book.type.name

例如,当我输入 'a' 时,我希望函数返回 book.name.include(a) + book.description.include(a) 和 book.type.name.include(a)

我理解这是因为我首先将查询放入列表中,然后使用类型架构填充,但是有什么方法可以先填充,然后在 db 查询级别(不是 nodejs)中过滤数据

非常感谢!

编辑!

我按照 ISAE 的回答进行了操作,并且奏效了。我想问一下如何改变查询条件。我试过了:

var query = `$or: [
      {"name": {"$regex": req.query.search}},
      {"description": {"$regex": req.query.search}},
      {"tenant": {"$regex": tenantIds}}
]`
Books.find({query}).lean();

但它不起作用。谢谢!

1 个答案:

答案 0 :(得分:0)

mongoose .populate() 对查询结果执行,因此您不能在一个查询中执行此操作。您需要运行两个查询,一个是返回 types 的列表,另一个是获取书籍。
你可以试试这样的:

let typeIds = await Types.find({
   name: {$regex: req.query.search}})
   .select("_id")
   .lean();

let list = await Books.find({
   $or:[
      {name: {$regex: req.query.search}},
      {description: {$regex: req.query.search}},
      {type: {$in:typeIds}}
       ]
}).populate("type").lean();

顺便说一句,我相信 type 是猫鼬中的保留关键字,您不应该在您的架构中使用它。改用 bookType 之类的东西。