【问题标题】:Error when using a text index on Mongodb在 Mongodb 上使用文本索引时出错
【发布时间】:2014-11-28 07:52:29
【问题描述】:

我正在尝试在 Mongodb 上使用文本索引。

我已经在一个集合上使用了文本索引:

db.ensureIndex({field1 : "text"}) 

它有效。

但我重试了另一个集合,我收到以下消息:

db.movies.ensureIndex({genres: "text"})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "ok" : 0,
    "errmsg" : "found language override field in document with non-string type",
    "code" : 17261
}

集合“movies”有一个“genres”字段,它是一个字符串数组。 例如:

> db.movies.findOne()
{
    "_id" : ObjectId("51c460fdc30a209dd9621dc4"),
    "genres" : [
            "Crime",
            "Drama"
    ]
    ...
}

此字段存在于所有文档中。

我不明白这个错误。任何想法 ?

【问题讨论】:

  • 您可以添加db.movies.getIndexes() 显示的内容吗?还显示完整的电影文档。 movies 文档似乎有一个名为 language 的字段,其值为数组类型。

标签: mongodb


【解决方案1】:

当您尝试在文档中的某个字段上创建text 索引,并且该文档有一个名为languagefield 属于非字符串 类型时,会发生此错误。

来自docs

如果一个集合包含文档或子文档 不同的语言,在文档中包含一个名为 language 的字段 或子文档,并将其值指定为该语言 文档或子文档。

MongoDB 将使用该文档的指定语言或 构建文本索引时的子文档

默认情况下,构建文本索引的语言是英语。如果一个名为language 的字段出现在文档的范围内,MongoDb 会假定它是一个指定用于为该文档构建索引的语言的字段。

因此,在您使用 text index 并且有一个名为 language 的字段是文档的一部分并且 不是 指定用于构建索引的语言的字段的情况下,要欺骗 MongoDB ,您需要将language_override 属性设置为一些不存在的虚拟字段。这是为了通知 MongoDb,看,你应该使用英语作为默认语言,并且如果我的文档包含一个名为 dummy 的字段,然后使用该字段中的值作为语言来构建该文档的索引,不是 language 字段。

db.movies.ensureIndex( { generes: "text" },
                       { language_override: "dummy" } )

【讨论】:

  • 小时搜索这个问题的答案,解决方案非常简单。谢谢蝙蝠尖叫
【解决方案2】:

您的电影收藏包含一个字段“语言”,其类型不被 mongo DB 接受。确保“语言”不是空字符串,只包含这些值(参见Text Search Languages):

da or danish
nl or dutch
en or english
fi or finnish
fr or french
de or german
hu or hungarian
it or italian
nb or norwegian
pt or portuguese
ro or romanian
ru or russian
es or spanish
sv or swedish
tr or turkish

【讨论】:

  • 答案的第一部分是不正确的。在这种情况下,您会收到错误消息:language override unsupported: value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2018-09-27
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多