当然,这很简单。我无法弄清楚。在Mongo Shell中,我有以下命令:
db.getCollection("CollectionName")
.findAndModify({query: {"Property.0.Element": {"$type" : 1}},
update: {$set: {"Property.0.Element":""}}
})
如果我多次运行此命令,最终它将返回null,并且我知道我已经更改了所有想要更改的字段。但是,如果我运行:
for(j = 0; j < 50;j++) {
var loc = "Property."+j+".Element";
db.getCollection("ShelbyCoAssessorDeepStaging")
.findAndModify({query: {loc : {"$type" : 1}},
update: {$set: {loc:""}}
})
}
然后我返回了null,但实际上没有任何值更改。为什么是这样?注意:我正在Studio3T的智能外壳中针对3.6.6版的Atlas集群运行此代码。
答案 0 :(得分:1)
您正在尝试对查询对象使用动态键。但是JavaScript在对象文字中不支持这种方法。请在MongoDB Shell或Studio 3T的IntelliShell上考虑以下示例:
> var fieldName = "foo"
> var query = { fieldName: 1 }
> printjsononeline(query)
{ "fieldName" : 1 }
在这个小例子中,我们创建一个变量,该变量包含要在查询对象中设置的键的名称。但是JavaScript并不希望将变量作为对象文字内的键。该符号直接用作键名,键是否带引号绝对无关紧要。
如果要在JavaScript中使用动态键名,则可以使用简单的括号表示法(或“成员索引访问”):
> var fieldName = "foo"
> var query = {}
> query[fieldName] = 1
1
> printjsononeline(query)
{ "foo" : 1 }
如果将其应用于您的示例,我们将获得以下代码在MongoDB Shell或Studio 3T IntelliShell上运行:
for(j = 0; j < 50;j++) {
var loc = "Property."+j+".Element";
var theQuery = {};
theQuery[loc] = {"$type" : 1};
var theUpdate = {$set: {}};
theUpdate["$set"][loc] = "";
db.getCollection("ShelbyCoAssessorDeepStaging")
.findAndModify({query: theQuery,
update: theUpdate
})
}