好的,我正在寻找更新符合以下查询的所有文件:
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中的嵌套阵列支持不是很好),但是我希望你们中的一个可以帮助我。提前致谢! :)
答案 0 :(得分:1)
根据问题底部的描述,
我对查询部分的理解是:Reason
和Modules
符合标准
在“值”的相同元素中,则文档需要更新。
因此,我相应地使用$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时,所有文件都被修改,循环退出 上述代码的缺点是:更新同一文档可能需要很多次 但它的线程安全。
以下代码与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++;
}