首页 > 解决方案 > MongoDB:删除位置

问题描述

在 MongoDB 控制台中,如何删除列表大小大于 3 的字段(键)?这是我的 json 文档示例:

 [{
    "_id": {
        "$oid": "5e52d5d665a51b1952871b4b"
    },
    "domains": {
        "youtube_com_": [
            "10.0.0.6",
            "10.0.0.3",
            "10.0.0.7"
        ],
        "imrworldwide_com_": [
            "10.0.0.2",
            "10.0.0.10",
            "10.0.0.4"
        ],
        "adadvisor_net_": [
            "10.0.0.3"
        ],
        "scorecardresearch_com_": [
            "10.0.0.2"
        ],
        "adnxs_com_": [
            "10.0.0.2",
            "10.0.0.3",
            "10.0.0.7",
            "10.0.0.6",
            "10.0.0.9"
        ],
        "doubleclick_net_": [
            "10.0.0.8",
            "10.0.0.7"
        ],........

在字段 (key)domains中,对于每个域名,检查 IP 地址的数量是否小于 3。如果是,则删除该域。

标签: mongodbpymongo

解决方案


您可以使用复杂的聚合查询,但这是我更喜欢 pymongo 的地方,因为它(恕我直言)更清晰:

records = db.mycollection.find()
for record in records:
    domains = record.get('domains')
    for domain in domains.copy():
        ips = domains.get(domain)
        if len(ips) <3:
            record['domains'].pop(domain)

    db.mycollection.replace_one({'_id': record['_id']}, record, upsert=True)

pprint.pprint(db.mycollection.find_one({}))

这将删除任何少于 3 个条目的域(if len(ips) <3根据需要调整逻辑):

{'_id': ObjectId('5e530f9277fa4a34f9c5c2be'),
 'domains': {'adnxs_com_': ['10.0.0.2',
                            '10.0.0.3',
                            '10.0.0.7',
                            '10.0.0.6',
                            '10.0.0.9'],
             'imrworldwide_com_': ['10.0.0.2', '10.0.0.10', '10.0.0.4'],
             'youtube_com_': ['10.0.0.6', '10.0.0.3', '10.0.0.7']}}

推荐阅读