模型的猫鼬搜索关键字以及填充模型
Mongoose search keyword for model and also the populate model
我有 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 时,只有 return 本书包含 book.name 和 book.description。我也想要 return book.type.name
例如,当我键入 'a' 时,我想要函数 returns book.name.include(a) + book.description.include(a) 和 book.type.name.include(a)
我明白,因为我先将查询放入列表中,然后使用 Types Schema 填充,但是有什么方法可以先填充然后在数据库查询级别(不是 nodejs)中过滤数据
非常感谢!
编辑!
我遵循了 ISAE 的答案并且它起作用了。我想问一下如何改变查询条件。我试过了:
var query = `$or: [
{"name": {"$regex": req.query.search}},
{"description": {"$regex": req.query.search}},
{"tenant": {"$regex": tenantIds}}
]`
Books.find({query}).lean();
但是没有用。谢谢!
mongoose .populate()
对查询结果执行,因此您不能在一个查询中执行此操作。您将需要 运行 两次查询,一次查询 return 一个 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
是 mongoose 中的保留关键字,您不应该在您的架构中使用它。改用 bookType
之类的东西。
我有 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 时,只有 return 本书包含 book.name 和 book.description。我也想要 return book.type.name
例如,当我键入 'a' 时,我想要函数 returns book.name.include(a) + book.description.include(a) 和 book.type.name.include(a)
我明白,因为我先将查询放入列表中,然后使用 Types Schema 填充,但是有什么方法可以先填充然后在数据库查询级别(不是 nodejs)中过滤数据
非常感谢!
编辑!
我遵循了 ISAE 的答案并且它起作用了。我想问一下如何改变查询条件。我试过了:
var query = `$or: [
{"name": {"$regex": req.query.search}},
{"description": {"$regex": req.query.search}},
{"tenant": {"$regex": tenantIds}}
]`
Books.find({query}).lean();
但是没有用。谢谢!
mongoose .populate()
对查询结果执行,因此您不能在一个查询中执行此操作。您将需要 运行 两次查询,一次查询 return 一个 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
是 mongoose 中的保留关键字,您不应该在您的架构中使用它。改用 bookType
之类的东西。