【问题标题】:Mongoose search keyword for model and also the populate model模型和填充模型的猫鼬搜索关键字
【发布时间】:2021-09-19 02:39:28
【问题描述】:

我有 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)

我明白,因为我首先将查询放入列表中,然后使用 Types Schema 填充,但是有什么方法可以先填充,然后在 db 查询级别(不是 nodejs)过滤数据

非常感谢!

编辑!

我遵循了 ISAE 的答案,它奏效了。我想问我如何改变查询条件。我试过了:

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

但它不起作用。谢谢!

【问题讨论】:

    标签: mongodb mongoose mongoose-populate


    【解决方案1】:

    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 之类的东西。

    【讨论】:

    • 谢谢,问题解决了。将 Types Schema 更改为 bookTypes 也是一个好主意。祝你有美好的一天!
    • 有什么办法可以将查询条件放入变量中?我试过 var query = $or:[ {name: {$regex: req.query.search}}, {description: {$regex: req.query.search}}, {type: {$in:typeIds}} ]但它不起作用
    • Query 只是一个 javascript 对象,应该以相同的方式工作(例如 [key]: val 等)
    猜你喜欢
    • 2021-05-16
    • 2020-11-02
    • 2016-04-25
    • 2021-12-25
    • 2021-06-29
    • 2019-12-27
    • 2019-05-04
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多