【发布时间】:2020-07-01 19:45:55
【问题描述】:
我正在尝试搜索主题、名称和关键字。我希望首先搜索文本,如果找到包含这些单词的帖子以找到用户,然后通过 user.name 和主题进行查询,但是当我使用这个时:
const posts = await Post.aggregate([
{
$match: {
$text: {
$search: postWords ? `${postWords}` : /.*/,
$caseSensitive: false,
},
},
},
{
$lookup: {
from: "users",
localField: "user",
foreignField: "_id",
as: "user",
},
},
{
$unwind: "$user",
},
{
$match: {
$and: [
{
topic: {
$regex: postTopic ? postTopic : /.*/,
$options: "i",
$exists: true,
},
},
{
"user.name": {
$regex: postName ? postName : /.*/,
$options: "i",
$exists: true,
},
},
{ text: { $regex: postWords ? postWords : /.*/, $options: "i" } },
],
},
},
{
$skip: req.params.page ? (req.params.page - 1) * 10 : 0,
},
{
$limit: 11,
},
{
$project: {
"user.password": 0,
"user.active": 0,
"user.email": 0,
"user.temporaryToken": 0,
},
},
]);
假设文本是 lorem ipsum,我尝试使用诸如“ipsum lorem”之类的关键字进行搜索不起作用,但使用“lorem ipsum”可以。 postWords 是一个用空格分隔单词的字符串(如果需要,我也可以将其设为数组)。
编辑 1:
$and: [
{
topic: {
$regex: postTopic ? postTopic : /.*/,
$options: "i",
$exists: true,
},
},
{
text: {
$regex: `/${postWords}/g`,
$options: "i",
},
},
{
"user.name": {
$regex: postName ? postName : /.*/,
$options: "i",
$exists: true,
},
},
【问题讨论】:
-
你的问题是什么?
-
如何按关键字搜索。让我举个例子,如果我们在帖子 N “Lorem ipsum dolor sit amet”中有以下文字,如果我有以下关键字“ipsum sit”或“ipsum Lorem”来返回这篇文章。
-
$text 采用字符串参数,而不是正则表达式。您是否尝试过 $text 文档中的示例?
-
是的,我试过了,但也许我做错了什么。这就是为什么在这里提出问题。有什么想法可能是问题所在?
-
文本索引是如何创建的?
标签: mongodb aggregation-framework