mongo db : 从 objects 的数组中获取子数组,其值在单个文档的范围内

mongo db : get sub array from an array of objects with values within a range in a single document

我有:

collection1

{
    "_id" : 1,
    "data" : [ 
        {
            "k1" : "001",
            "k2" : "v1"
        }, 
        {
            "k1" : "002",
            "k2" : "v2"
        }, 
        {
            "k1" : "004",
            "k2" : "v3"
        }, 
        {
            "k1" : "010",
            "k2" : "v4"
        }, 
        {
            "k1" : "015",
            "k2" : "v5"
        }
    ]
}

我想要的:

我想从 data 数组中获取所有 objects,其中 k1003012 都包括在内,来自文档 _id = 1

我在互联网上搜索的结果:

我在 mongo$match, $project, $filter 等中了解了聚合函数。我是 mongo 的新手,无法获得聚合背后的直觉。

我知道我可以通过自定义函数实现这一点,但它会包含一个会影响性能的 for 循环。必须有更好的方法来实现它,但我无法弄清楚。

Note: I also want to achieve the same with pymongo

抱歉,我不知道 pymongo 但下面的查询是基本思路(只要将所有 MongoDB 运算符放在双引号内 "" 直接使用此查询就可以了):

试试这个:

db.collection1.aggregate([
    {
        "$match": { "_id": 1 }
    },
    {
        "$addFields": {
            "data": {
                "$filter": {
                    "input": "$data",
                    "as": "item",
                    "cond": {
                        "$and": [
                            { "$gte": [{ "$toInt": "$$item.k1" }, 3] },
                            { "$lte": [{ "$toInt": "$$item.k1" }, 12] }
                        ]
                    }
                }
            }
        }
    }
]);

输出:

{
    "_id" : 1,
    "data" : [
        {
            "k1" : "004",
            "k2" : "v3"
        },
        {
            "k1" : "010",
            "k2" : "v4"
        }
    ]
}