【问题标题】:find in nested array pymongo [duplicate]在嵌套数组pymongo中查找[重复]
【发布时间】:2018-04-23 02:31:55
【问题描述】:

我正在尝试查询 MongoDB 数据库以查找包含特定 ID 的所有结果:

我的架构如下所示:

_id: xyz
ad_accounts: [{"name":"abc, "ads:{"campaings":[123, 4456, 574]}}]

我需要在“campaigns”中找到所有包含 123 的结果

这是更好的架构图:

我尝试了以下方法:

results = db.data.find({"ad_accounts.ads.campaigns": 123})

但它不起作用,因为 ad_accounts 是一个数组,我也尝试过循环:

for data in all_data:
    for account in data['ad_accounts']:
        if first_ad in account['ads']['campaigns]:
            print("this is the one")

但我不认为这是最好的。

是否有查询嵌套数据的内置方法?谢谢

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    离开你的例子,你可以使用这个语法:

    >>> for match in collec.find({ "ad_accounts.0.ads.campaigns" : { "$in" : [123] } }):
    ...     print(match)
    ...     
    {'_id': ObjectId('5adcd32690542e05e121bbdd'), 'ad_accounts': [{'name': 'abc', 'ads': {'campaigns': [123, 4456, 574]}}]}
    

    $in 是用于匹配数组中任何元素的命令。

    用 pymongo 重现这个例子:

    from pymongo import MongoClient
    
    client = MongoClient()
    test_db = client.test_db
    collec = test_db.collec
    
    val1 = {"ad_accounts": [{"name": "abc", "ads": {"campaigns": [123, 4456, 574]}}]}
    val2 = {"ad_accounts": [{"name": "abc", "ads": {"campaigns": [999, 4456, 574]}}]}
    
    collec.insert_many([val1, val2])
    

    对于嵌套数组,您需要elemMatch

    【讨论】:

    • 嗨,布拉德,谢谢,但在您的示例中,您对数组中的第一个元素进行了硬编码,例如ad_accounts.0.ads.campaigns 如果是第 3 次或第 10 次呢?
    • @Costantin 0 不表示活动数组的第一个元素;它是 ad_accounts 的第一个元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2017-09-30
    • 2019-08-06
    • 2013-06-17
    相关资源
    最近更新 更多