MongoDB查询变异的字段 - 通配符?

时间:2014-12-16 17:08:11

标签: regex mongodb

我正在寻找一种方法,从具有类似于以下结构的集合中获取不同的“单位”值:

{
    "_id" : ObjectId("548b1aee6e444414f00d5cf1"),
    "KPI" : {
      "NPV" : {
        "value" : 100,
        "unit" : "kUSD"
      },
      "NPM" : {
        "value" : 100,
        "unit" : "kUSD"
      },
      "GPM" : {
        "value" : 50,
        "unit" : "CAD"
      }
    }
}

我研究过使用通配符和正则表达式,但是从我遇到的情况来看,字段匹配不支持。我想做一些像db.collection.distinct('KPI。*。unit')这样的东西,但是无法确定性能如何,看起来性能差。有人有推荐吗?感谢。

1 个答案:

答案 0 :(得分:4)

将密钥作为文档内容的一部分并不是一个好习惯 - 不要将密钥用作数据。如果您不更改文档结构,则需要知道KPI的可能子字段是什么。如果您不知道那些可能是什么,您将需要手动检查文档以找到它们。然后,您可以使用点表示法为每个发出不同的符号,例如: db.collection.distinct("KPI.NPM.unit")

如果你要查找的内容是父unit子字段的所有值中KPI的不同值,那么你可以将所有结果的联合作为区分。您也可以使用MongoDB 2.6中的聚合框架轻松完成。为简单起见,我假设KPI只有三个不同的子字段,即上述文档中的字段。

db.collection.aggregate([
    { "$group" : { "_id" : 0, "NPVunits" : { "$addToSet" : "$KPI.NPV.unit" }, "NPMunits" : { "$addToSet" : "$KPI.NPM.unit" }, "GPMunits" : { "$addToSet" : "$KPI.GPM.unit" } }
    { "$project" : { "distinct_units" : { "$setUnion" : ["$NPVunits", "$NPMunits", "$GPMunits"] } } }
])

您还可以将数据结构化为dynamic attributes。上面的文档将重新编写为

{
    "_id" : ObjectId("548b1aee6e444414f00d5cf1"),
    "KPI" : [
      { "type" : "NPV", "value" : 100, "unit" : "kUSD" },
      { "type" : "NPM", "value" : 100, "unit" : "kUSD" },
      { "type" : "GPM", "value" : 50, "unit" : "CAD" }
    ]
}

现在可以轻松查询不同的单位,无论您是需要每种类型还是所有类型:

每种类型(一个查询中的所有类型)

db.collection.aggregate([
    { "$unwind" : "$KPI" },
    { "$group" : { "_id" : "$KPI.type", "units" : { "$addToSet" : "$KPI.unit" } } }
])

所有类型

db.collection.distinct("KPI.unit")