猫鼬指数已经存在不同的选择

sup*_*tle 3 javascript full-text-search mongoose mongodb node.js

我正在为我的应用程序实现搜索结果视图.我发现mongoose内部提供带有$ text的全文搜索功能.

我把下面的代码放到Post.js上

PostSchema.index({desc: 'text'}); //for example
Run Code Online (Sandbox Code Playgroud)

这是我在路由文件route/posts.js中放入的代码

Post.find({$text: {$search : 'please work!'}}).exec(function (err, posts) {...}) 
Run Code Online (Sandbox Code Playgroud)

我想出的错误信息如下

Index with pattern: { _fts: "text", _ftsx: 1 } already exists with different options
Run Code Online (Sandbox Code Playgroud)

是否有任何机构知道如何处理这个错误并弄明白?谢谢.

sat*_*ati 6

检查您定义了文本索引的字段.现在mongodb每个集合只允许一个文本索引.因此,如果您在desc列上定义了文本索引并尝试在其他列上使用该索引,则必然会出现此错误.

您可以尝试查询索引并查看您创建它的列.要获得索引,您可以执行

db.collection.getIndexes()
Run Code Online (Sandbox Code Playgroud)

它会返回这样的东西

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "some.ns"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "desc_text",
        "ns" : "some.ns",
        "weights" : {
            "title" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 2
    }
]
Run Code Online (Sandbox Code Playgroud)

现在,如果您想在其他列中使用此范围也可以使用此索引,只需删除此索引即可

db.collection.dropIndex('desc_text');
Run Code Online (Sandbox Code Playgroud)

然后通过包含要由文本索引覆盖的所有列来重新创建它,

db.collection.createIndex({
    title:'text;,
    body: 'text;,
    desc: 'text',
    ...... and so on
});
Run Code Online (Sandbox Code Playgroud)