基于一组条件从嵌套数组中提取MongoDB $

时间:2014-10-13 21:45:13

标签: mongodb

好的,我正在寻找更新符合以下查询的所有文件:

var searchArray = ["AH Refer"
];
db.ReasonTest.find({ 
$and: [
    {
        "Values.Reason": {
            $in: searchArray
        }
    },
    {
        "Values.Modules": {
            $all: ["Provider Search"]
        }
    }
]
});

我的文档结构如下:

{
"_id" : ObjectId("537398e92db5868b145f5f29"),
"ID" : NumberLong(1),
"Name" : "MCC",
"Values" : [ 
    {
        "ID" : NumberLong(1016),
        "Reason" : "COB",
        "Modules" : [ 
            "SRA"
        ]
    }, 
    {
        "ID" : NumberLong(104),
        "Reason" : "AH Refer",
        "Modules" : [ 
            "Provider Search"
        ]

    }
]
}

基本上,我想要做的是找到所有原因(根文档),它具有值数组的Reason字段中的上述值之一(例如" AH Refer")。如果他们有"提供商搜索"在Modules数组中,我想删除" Provider Search"来自Modules数组中的值"值"。对于这个客户来说,我真的很难过。显然他们的结构并不理想(Mongo中的嵌套阵列支持不是很好),但是我希望你们中的一个可以帮助我。提前致谢! :)

1 个答案:

答案 0 :(得分:1)

根据问题底部的描述, 我对查询部分的理解是:ReasonModules符合标准 在“值”的相同元素中,则文档需要更新。 因此,我相应地使用$elemMatch修改了查询部分。

var searchArray = [ "AH Refer to CMC: Claims Inquiry",
        "AH Refer to CMC:  Eligibility Inquiry",
        "AH Refer to CMC: Requested Benefit Information",
        "After Hours - Referred to CMC", "After Hours Referred to RHBA" ];

var moduleValue = "Provider Search";

while (db.ReasonTest_Kyle.update({
    Values : {
        $elemMatch : {
            Reason : {
                $in : searchArray
            },
            Modules : moduleValue
        }
    }
}, {
    $pull : {
        "Values.$.Modules" : moduleValue
    }
}, {
    multi : true
}).nModified);

当nModified == 0时,所有文件都被修改,循环退出 上述代码的缺点是:更新同一文档可能需要很多次 但它的线程安全。


APPEND

以下代码与V2.6之前的MongoDB版本兼容

var searchArray = [ "AH Refer to CMC: Claims Inquiry",
        "AH Refer to CMC:  Eligibility Inquiry",
        "AH Refer to CMC: Requested Benefit Information",
        "After Hours - Referred to CMC", "After Hours Referred to RHBA" ];

var moduleValue = "Provider Search";

var query = {
        Values : {
            $elemMatch : {
                Reason : {
                    $in : searchArray
                },
                Modules : moduleValue
            }
        }
    };

var nCallUpdate = 0;

while ( db.ReasonTest_Kyle.findOne(query, {_id :1}) ) {
    db.ReasonTest_Kyle.update(query, {
        $pull : {
            "Values.$.Modules" : moduleValue
        }
    }, {
        multi : true
    });
    nCallUpdate++;
}