首页 > 解决方案 > 如何在 mongo shell 中迭代查询

问题描述

当然,这很简单。我无法弄清楚这一点。在 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 集群运行此程序。

标签: mongo-shellstudio3t

解决方案


您正在尝试对查询对象使用动态键。但是 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
                      })
}

推荐阅读