Go语言 如何为具有相同名称的嵌套字段创建文本索引

cetgtptt  于 2023-01-22  发布在  Go
关注(0)|答案(1)|浏览(149)

我尝试在两个同名的嵌套字段上创建一个复合文本索引,这样做的原因是我可以使用mongo在两个字段上执行全文搜索。

数据结构示例

{
    "createdAt": "2023-01-20T18:39:45.551Z",
    "id": "63cadff13fc409d0b026f219",
    "userId": "63c13a9ba4c921b78e7d1a3a",
    "question": {
        "statement": "what is the atomic number of potassium?",
        "fileUrl": "http://localhost:4000/media/90152d8363424e688ad6e9505194a818.jpg",
        "mediaType": 2
    },
    "answer": {
        "statement": "19"
    }
}

从示例中可以看到,questionanswer具有相同的嵌套字段statement。* 我尝试在问题和答案语句上都建立文本索引 *

我想做的事

textSearchIndexModel := mongo.IndexModel{
        Keys: bson.D{
            {Value: "question.statement", Key: "text"},
            {Value: "answer.statement", Key: "text"},
        },
        Options: options.Index().SetName("textSearchIndex"),
    }

这不起作用并产生此错误:

Failed to create index for flashcard collection:....caused by :: 
The field 'text' appears multiple times in the index key pattern
  • 有什么办法吗?
  • 我的方法对于我想要实现的目标来说是正确的吗?

附言:如果你不熟悉go,你也可以上传它在mongodb上的样子,因为到mongodb go驱动程序的Map是相当直接的

pkmbmrz7

pkmbmrz71#

注意,一个集合最多只能有一个text index
如果您知道这一点,并且希望创建一个同时覆盖"question.statement""answer.statement"的文本索引,那么这是可行的。
您的错误在于索引规范:bson.D表示一个文档,一个有序的属性列表(名称-值对),它是bson.E的一个切片,其中bson.E为:

type E struct {
    Key   string
    Value interface{}
}

Key是属性的名称,Value是该属性的值,所以你把它倒过来,它应该是:

textSearchIndexModel := mongo.IndexModel{
    Keys: bson.D{
        {Key: "question.statement", Value: "text"},
        {Key: "answer.statement", Value: "text"},
    },
    Options: options.Index().SetName("textSearchIndex"),
}

相关问题