我正在寻找一种方法,从具有类似于以下结构的集合中获取不同的“单位”值:
{
"_id" : ObjectId("548b1aee6e444414f00d5cf1"),
"KPI" : {
"NPV" : {
"value" : 100,
"unit" : "kUSD"
},
"NPM" : {
"value" : 100,
"unit" : "kUSD"
},
"GPM" : {
"value" : 50,
"unit" : "CAD"
}
}
}
我研究过使用通配符和正则表达式,但是从我遇到的情况来看,字段匹配不支持。我想做一些像db.collection.distinct('KPI。*。unit')这样的东西,但是无法确定性能如何,看起来性能差。有人有推荐吗?感谢。
答案 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")