我有一个文档集合,每个文档都有一个嵌套文档,名为" attributes"在这个例子中:
document1: {
description: 'text text etc',
attributes: {
Name: 'Alice',
Height: '170',
FavouriteColour: 'Blue'
}
}
document2: {
description: 'more text etc',
attributes: {
Name: 'Bob',
State: 'NY'
}
}
我不知道密钥的名称是什么,因为它们是用户定义的。
我想对该文档中所有属性的值执行文本搜索,而不必指定键,但为了执行文本搜索,我需要一个$text查询的文本索引,所以这个是不可能的:
db.collection.aggregate([
{$match: {$text: {$search: 'NY'}}},
{$group: {_id: {$meta: "textScore"}, count: {$sum: 1}}}
])
由于我不知道我可能拥有哪些属性,有没有办法解决这个问题并对属性值执行文本搜索并返回与输入匹配的文档?
答案 0 :(得分:2)
是的但是。
是:您可以使用字符串内容索引所有字段,如下所示:
> db.collection.ensureIndex({ "$**": "text" }, { name: "TextIndex" })
但是:如果你可以避免它,不要让你的数据具有未知结构,特别是如果你让用户定义键和值。你能做点什么吗
{
"description" : "text text etc",
"attributes" : [
{ "key" : "Name", "value" : "Alice" },
{ "key" : "Height", "value" : "170" },
{ "key" : "FavouriteColour", "value" : "Blue" }
]
}