我的收藏集包含嵌套的文档,我正在尝试使“文本”出现在任何嵌套字段中,例如:
*Server
我能够获得带有“文本”字段的文档,如上所示
现在,我想为每个处理的文档存储“文本”,并在该文档中使用它更新另一个字段“名称”。我很难在查询中编写这种逻辑。
尝试失败:
var rerun = { $or: [
{"code_exception.java_40.code.Text": { $exists : true,$ne : "" } },//13816
{"code_exception.java_15.code.Text":{ $exists : true,$ne : ""} },//13485
{"code_exception.java_10.code.Text":{ $exists : true,//12994
{"code_exception.java_2.code.Text": { $exists : true,//13294
{"code_exception.java_4.code.Text": { $exists : true,//13437
{"code_exception.java.code.Text": { $exists : true,//13192
{"code_exception.java_1.code.Text": { $exists : true,$ne : ""} }//12951
]}
db.collection.find(rerun).count()//14093
db.collection.find(rerun).forEach(function(document) {
db.collection.update(
{ "_id": document._id },{ "$set": { "Name": document.code_exception.java_*.code.Text } }
);
})
将替换为数字[40,15,10,2,4,1,]。我知道这行不通,但是有人可以建议一种在$ OR中获取“文本”的匹配值的方法吗?
例如
-
*
符合doc1
条件,因此可以即时存储"code_exception.java_15.code.Text":{ $exists : true,$ne : ""}
并更新为同一doc1提交的“名称”。 - 类似地,如果集合中的
"code_exception.java_15.code.Text"
与doc2
条件匹配,则它可以即时存储"code_exception.java.code.Text":{ $exists : true,$ne : ""}
并更新针对同一doc1提交的“名称”。
有了一个简单的技巧!
由于如果我能够找到对应于"code_exception.java.code.Text"
的{{1}},那么我需要更新集合中的字段name
,其中*可以是数字[40,10, 2,1,]构成以上字段。
解决方案是分别运行每个过滤器并更新Text
字段。肯定会有多余的更新,但这不会成为问题,因为如果code_exception.java_*.code.Text
遗漏了某些文档,则可能会被Name
或其他过滤器填充。
我使用pymongo客户端进行黑客入侵:
java_40.code
将对每个过滤器执行一次以上代码7次,并更新java_1.code
字段!
有人有更好的解决方案吗?