首页 文章

使用Mongodb过滤阵列中的K-V

提问于
浏览
1

我有一个像这样的 mongodb 数据库:

{
    "_id" : ObjectId("530d24150fef5d9b065909ca"),
    "name" : "name 1",
    "my_array" : [
        {"key" : "date", "value": 19},
        {"key" : "id", "value": 5}
     ]
}
{
    "_id" : ObjectId("530d24150fef5d9b065909ca"),
    "name" : "name 2",
    "my_array" : [
        {"key" : "date", "value": 9},
        {"key" : "id", "value": 11}
     ]
}
{
    "_id" : ObjectId("530d24150fef5d9b065909ca"),
    "name" : "name 3",
    "my_array" : [
        {"key" : "date", "value": 10},
        {"key" : "id", "value": 13},
        {"key" : "name", "value": 'test'},
     ]
}

我想根据my_array中的K-V进行查询 . 我知道要列出具有键名的项目:

db.test.find({"my_array.key": 'name'})

但是,我不知道如何使用键值过滤项目,比如获取项目哪个键为'id'且值大于10.我的样本结果必须是:

{
    "_id" : ObjectId("530d24150fef5d9b065909ca"),
    "name" : "name 2",
    "my_array" : [
        {"key" : "date", "value": 9},
        {"key" : "id", "value": 11}
     ]
}
{
    "_id" : ObjectId("530d24150fef5d9b065909ca"),
    "name" : "name 3",
    "my_array" : [
        {"key" : "date", "value": 10},
        {"key" : "id", "value": 13},
        {"key" : "name", "value": 'test'},
     ]
}

而且,我曾尝试过以下命令行:

db.test.find({"my_array.key": 'id', "my_array.value": {$gt : 10}})
db.test.find({"my_array":{"key": 'id', "value": {$gt : 10}}})

那些都不行......

提前致谢 .

3 回答

  • 1

    您可以使用$elemMatch来实现相同的目标 .

    尝试以下查询 .

    db.test.find({my_array: {$elemMatch: {key: 'id', value: {$gt: 10}}}})
    
  • 2

    您需要使用$elemMatch查找包含符合条件的两个元素的文档:

    db.test.find(
        {
            "my_array": { "$elemMatch":{ 
                "key": "id", "value": { "$gt" : 10 }
            }}
        },
        {
            "my_array.$": 1
        }
    )
    

    请记住,这与文档匹配,而不是数组元素 . 这里使用投影只会获得 first 值 .

    如果要在阵列中过滤多个条目,则需要使用聚合:

    db.test.aggregate([
        { "$match": {
            "my_array": { "$elemMatch":{ 
                "key": "id", "value": { "$gt" : 10 }
            }}
        }},
        { "$unwind": "$my_array" },
        { "$match": {
            "my_array.key": "id",
            "my_array.value": { "$gt" : 10 }
        }},
        { "$group": {
            "_id": "$_id",
            "name": { "$first": "$name" },
            "my_array": { "$push": "$my_array" }
        }}
    ])
    
  • 1

    请参阅此内容以查找问题的答案 .
    db.test.find({my_array: {$elemMatch: {key: 'id', value: {$gt: 10}}}})

相关问题