MongoDB子文档上的不同值



我有一个有点奇怪的数据库结构,它是这样的:

我有一个具有普通属性的文档,然后我有一个元数据属性,它是一个对象数组。

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" ]

相关内容

  • 没有找到相关文章

最新更新