在不知道密钥的情况下查询子文档

时间:2018-02-15 22:46:39

标签: node.js mongodb mongoose

我有一个这样的集合:

{
"_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"
    }
}

我想查询" variableParameters"对象,但就像名称所说,这个属性是可变的。因此,在某些情况下,它会有" uf",但在其他情况下会赢得。

我实际上正在执行的查询只匹配mongoose模式中的常量字段:

{ 'phone': { $regex: filter, $options: 'i' } }

有什么方法可以查询" variableParameters"不知道他的孩子的财产?

3 个答案:

答案 0 :(得分:1)

如果您不确定密钥(因为它们是可变的),请尝试使用$text搜索

要使用文字搜索,我们需要为variableParameters索引。

也可以执行区分大小写的文本搜索,但它会影响性能。

有关文字搜索的更多信息,请阅读https://docs.mongodb.com/manual/reference/operator/query/text/

答案 1 :(得分:1)

[解决]

感谢@Clement Amarnath提供帮助。

解决方案是这样的:

_Events.find({ $text: { $search: 'searchText' } }, (err, events) => {
    if (err) return Exceptions.HandleApiException(err, res);
    res.send(events);
});

$ text参数可以具有以下属性:

{
  $text: {
      $search: <string>,
      $language: <string>,
      $caseSensitive: <boolean>,
      $diacriticSensitive: <boolean>
  }
}

$ search MongoDB解析并用于查询文本索引的一串术语。除非指定为短语,否则MongoDB会对这些术语执行逻辑OR搜索。有关该字段的更多信息,请参阅行为。

$ language 可选。确定搜索停用词列表的语言以及词干分析器和标记生成器的规则。如果未指定,则搜索使用索引的默认语言。有关支持的语言,请参阅文本搜索语言。

如果指定的语言值为&#34; none&#34;,则文本搜索使用简单的标记化,没有停用词列表且没有词干。

$ caseSensitive 可选。一个布尔标志,用于启用或禁用区分大小写的搜索。默认为false;即搜索遵循文本索引的不区分大小写。

$ diacriticSensitive 可选。一个布尔标志,用于启用或禁用对版本3文本索引的变音符敏感搜索。默认为false;即搜索推迟文本索引的变音符号不敏感。

有关详细信息,请参阅MongoDB Documentation

答案 2 :(得分:0)

您可以使用$ where来构建自己的匹配函数。 全文匹配的示例是:

db.col.find({$where: function(){
  return Object.values(this.variableParameters).includes("Rio de Janeiro")
}})