【问题标题】:Create a text index on MongoDB schema which references another schema在引用另一个模式的 MongoDB 模式上创建文本索引
【发布时间】:2015-08-28 14:01:04
【问题描述】:

我正在尝试使用 mongoose 为某个模式添加索引以进行文本搜索。如果我向单个字段添加文本索引,它可以正常工作,也可以使用复合索引。例如,这里提供的答案很棒:

Full text search with weight in mongoose

但是,我正在尝试向引用其他模式的字段添加索引。例如,我的模型如下所示:

    var Book = new Schema({
        "title": String,
        "createdAt": Date,
        "publisher": {
             "type": Schema.ObjectId,
             "ref": "Publisher"
        },
        "author": {
             "type": Schema.ObjectId,
             "ref": "Author"
        },
        "isbn": String
    });

因此,当您执行如下所述的搜索查询时,以下索引不起作用:

索引:

 Book.index({"title": "text", "publisher.name": "text", "author.firstName": "text"});

搜索查询:

function searchBooks(req, res) {
    var query = req.query.searchQuery;

    Book.find({ $text: { $search: query } })
        .populate('author publisher')
        .limit(25)
        .exec(function(err, books) {
            if (err) {
                res.json(err);
            } else {
                res.json(books);
            }
        }
    );
}

是否有人对如何为“发布者”和“作者”字段添加文本索引有任何建议,我正在使用“填充”mongodb 方法来提取这些模式的数据。

【问题讨论】:

  • 为什么人们这么难理解? “MongoDB 确实 执行 joins”。这是在互联网上搜索的最简单的术语。然而,人们每天都在问这个问题。您还应该了解 mongoose .populate() 不是加入。这只是为了看起来像的附加查询,它是对基本 API 的连接。
  • 好吧,也许你可以向我解释一下我应该确切地搜索什么。因为我不知道实现我想要做的事情的正确方法。

标签: javascript node.js mongodb indexing mongoose


【解决方案1】:

我认为,您正在寻找的是能够连接数据表并针对该数据的总和执行查询。这是您需要关系数据库的东西,而 MongoDB 不需要。

因此,我建议您更改执行搜索的方法,例如在作者和标题中搜索您的关键字,而不是尝试同时搜索整个数据集。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多