我有一个类似的集合:
{
"_id" : ObjectId("5a7c49b02d2bbb28a4b2e6a2"),
"phone" : "Pinheiro",
"email" : "Pinheiro",
"variableParameters" : {
"loremIpsum" : "Do you see a little Asian child with a blank expression on his face sitting outside on a mechanical helicopter that shakes when you put quarters in it?",
"uf" : "Rio de Janeiro",
"city" : "Rio de Janeiro",
"end" : "RUA JARDIM BOTÂNICO 1060",
"tel" : "5521999999999",
"eml" : "teste@gmail.com",
"nome" : "Usuario de Teste"
}
}
我想查询"变量参数"对象,但是就像名称所说的那样,此属性是可变的。因此,在某些情况下,它将具有" UF",但在其他情况下不会。
在{ 'phone': { $regex: filter, $options: 'i' } }
有什么办法可以在不知道他的孩子属性的情况下查询"变量参数"?
如果您不确定键(因为它们是可变的(,请尝试使用$ text Search
要使用文本搜索,我们需要索引variableParameters
。
案例敏感的文本搜索也可以执行,但会影响性能。
请阅读https://docs.mongodb.com/manual/reference/poerator/query/text/有关文本搜索的更多信息
[已解决]
感谢@Cllement amarnath的帮助。
解决方案是这样的:
_Events.find({ $text: { $search: 'searchText' } }, (err, events) => {
if (err) return Exceptions.HandleApiException(err, res);
res.send(events);
});
$文本参数可以具有此属性:
{
$text: {
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}
$ search 一串术语,该术语可以解析并用于查询文本索引。除非指定为短语,否则MongoDB对术语进行逻辑或搜索。有关现场的更多信息,请参见行为。
$ language 可选。确定搜索的停止单词列表的语言以及词干和令牌器的规则。如果未指定,则搜索使用索引的默认语言。有关支持的语言,请参阅文本搜索语言。
如果您指定了"无"的语言值,则文本搜索使用简单的令牌化,而没有停止单词列表,也没有stegming。
$ caseSimentive 可选。布尔标志以启用或禁用案例敏感搜索。默认为false;即,搜索范围对文本索引的不敏感性。
$ ducriticsentive 可选。一个布尔标志,可针对版本3文本索引启用或禁用变性敏感搜索。默认为false;即,搜索范围为文本索引的大气不敏感。
有关更多信息,请参见MongoDB文档。
您可以使用$在哪里构建自己的匹配功能。全文匹配的一个例子是:
db.col.find({$where: function(){
return Object.values(this.variableParameters).includes("Rio de Janeiro")
}})