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

Posted

技术标签:

【中文标题】mongo db:从对象数组中获取子数组,其值在单个文档的范围内【英文标题】:mongo db : get sub array from an array of objects with values within a range in a single document 【发布时间】:2021-06-09 13:14:56 【问题描述】:

我有什么:

一个mongodb 集合,比如collection1 collection1 包含两列,即。 iddata idint 但扭曲是 data 是一个对象数组,它的键是字符串但数字 collection1 包含只有一个文档 (为了这个问题)

收藏1


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

我想要什么:

我想从包含_id = 1 的文档中获取包含003012 两者的data 数组中的所有对象

我在网上搜索的结果:

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

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

注意:我也想用pymongo实现同样的效果

【问题讨论】:

【参考方案1】:

对不起,我不知道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"
        
    ]

【讨论】:

太完美了?,非常感谢,你能提供一些aggregate framework 的资源吗?有一些很好的例子吗? 检查这个:university.mongodb.com/courses/M121/about。我从这里学习了基础知识:university.mongodb.com/courses/M001/about 我建议在聚合之前先学习基础知识。

以上是关于mongo db:从对象数组中获取子数组,其值在单个文档的范围内的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档

从 Mongo DB 文档的数组中的对象数组中删除一个值

在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象

Mongo 查询(可视化工具)

如果mongo db中存在/不存在字段,如何向对象添加数组数据

合并数组中的两个对象,其中一个对象的键嵌套比另一个对象更深,位于 Mongo DB 的同一文档中