我有一个有点奇怪的数据库结构,它是这样的:
我有一个具有普通属性的文档,然后我有一个元数据属性,它是一个对象数组。
metadata: {[
{
key: [key],
value: [value]
},
...
]}
Edit:元数据子文档中永远不会有重复的密钥
这样做是为了保留元数据对象的顺序
现在我想获得具有给定键的元数据对象的不同值。
我想找到每一个不同的[值],其中[key] ="x"使用MongoDB。并在数组(而不是文档)中返回不同的值
我猜这是不可能使用不同的命令,但这是可能的使用聚合管道或我必须使用Map-Reduce?
有什么建议吗?
提前感谢!:)
我想你是这个意思:
{
"metadata": [
{ "key": "abc", "value": "borf" },
{ "key": "cdc", "value": "biff" }
]
},
{
"metadata": [
{ "key": "bbc", "value": "barf" },
{ "key": "abc", "value": "borf" },
{ "key": "abc", "value": "barf" }
]
}
如果你过滤"abc",得到不同的"value"条目,像这样:
db.collection.aggregate([
{ "$match": { "metadata.key": "abc" } },
{ "$unwind": "$metadata" },
{ "$match": { "metadata.key": "abc" } },
{ "$group": {
"_id": "$metadata.value"
}}
])
或者更好:
db.collection.aggregate([
{ "$match": { "metadata.key": "abc" } },
{ "$redact": {
"$cond": {
"if": { "$eq": [ { "$ifNull": [ "$key", "abc" ] }, "abc" ] },
"then": "$$DESCEND",
"else": "$$PRUNE"
}
}},
{ "$unwind": "$metadata" },
{ "$group": {
"_id": "$metadata.value",
"count": { "$sum": 1 }
}}
])
等于:
{ "_id": "barf", "count": 1 },
{ "_id": "borf", "count": 2 }
但它是不可能的这只是一个数组的"barf"one_answers"borf"。distinct()
方法只处理键数组,但它也非常有限。因此,它只能这样做:
db.collection.distinct("metadata.value",{ "metadata.key": "abc" })
[ "biff", "borf", "barf" ]
结果是不正确的。因此,只需从上面的"document"结果中提取一些"后期处理":
db.collection.aggregate([
{ "$match": { "metadata.key": "abc" } },
{ "$redact": {
"$cond": {
"if": { "$eq": [ { "$ifNull": [ "$key", "abc" ] }, "abc" ] },
"then": "$$DESCEND",
"else": "$$PRUNE"
}
}},
{ "$unwind": "$metadata" },
{ "$group": {
"_id": "$metadata.value"
}}
]).map(function(doc) {
return doc._id;
})
结果是一个包含不同值的普通数组:
[ "borf", "barf" ]