Javascript MongoDB/Node.JS:在循环中插入文档-变量不更新?
我对MongoDB相对来说(阅读:非常)陌生,遇到了一些让我困惑的事情 我有一个Employee对象数组,每个对象基本上如下所示:Javascript MongoDB/Node.JS:在循环中插入文档-变量不更新?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我对MongoDB相对来说(阅读:非常)陌生,遇到了一些让我困惑的事情 我有一个Employee对象数组,每个对象基本上如下所示: { "Name" : "Jack Jackson", "Title" : "Senior Derp Engineer", "Specialties" : [ "Kicking", "Screaming", "Throwing Tantrums" ] } …我想把它们作为文档插入我的收藏 这是代码(简化): var colle
{
"Name" : "Jack Jackson",
"Title" : "Senior Derp Engineer",
"Specialties" : [
"Kicking",
"Screaming",
"Throwing Tantrums"
]
}
…我想把它们作为文档插入我的收藏
这是代码(简化):
var collection=db.collection('Employees');
对于(var ix=0;ix我想出了如何获取对象:
var collection = db.collection('Employees');
for (var ix=0; ix<allEntries.length; ix++) {
var item = allEntries[ix];
collection.insert(item, function(err, docs) {
if (err) { MyErrorCallback(err); }
else {
// Insert specialties
var insertedItem = docs["ops"][0];
console.log(insertedItem["_id"] + ": " + insertedItem["Specialties"].length + " specialties.");
// ...Code goes here which will insert a document into another collection associating the item's ObjectID with each specialty in the list.
}
});
}
var collection=db.collection('Employees');
对于(变量ix=0;ix)
但是,我确实不理解作用域在这里的工作方式,因为函数传递到collection.insert()中,它可以访问项
,但它的行为对我来说毫无意义…?我知道了如何获取对象:
var collection = db.collection('Employees');
for (var ix=0; ix<allEntries.length; ix++) {
var item = allEntries[ix];
collection.insert(item, function(err, docs) {
if (err) { MyErrorCallback(err); }
else {
// Insert specialties
var insertedItem = docs["ops"][0];
console.log(insertedItem["_id"] + ": " + insertedItem["Specialties"].length + " specialties.");
// ...Code goes here which will insert a document into another collection associating the item's ObjectID with each specialty in the list.
}
});
}
var collection=db.collection('Employees');
对于(变量ix=0;ix)
但是,我确实不理解作用域在这里的工作方式,因为函数传递到collection.insert()中有权访问项,但它的行为对我来说没有任何意义…?插入回调函数中的docs变量包含新插入的项及其objectID,因此只需对其执行所需操作即可
请尝试回调中的console.log(docs)以查看发生了什么。插入回调函数中的docs变量包含新插入的项及其objectID,因此只需对其执行所需操作即可
尝试回调中的console.log(docs)来查看发生了什么。这就是Node.js的工作方式,我花了太多时间来了解在像您这样的情况下发生了什么。Node.js希望无阻塞,这意味着此代码是异步运行的
例如:
for循环运行并将项设置为例如“1”。现在它调用mongoDB函数。到目前为止一切正常。问题是:Node.js不会等待继续for循环直到调用回调函数。for循环将继续。这意味着,该项将获得值,例如“2”现在,当调用回调时,for循环将结束。每个函数都将记录:“2”,因为这是变量的实际值
如果您在回调函数中打印出i的值,您可以看到一个示例。这就是Node.js的工作方式,我花了太多时间来理解在您这样的情况下发生的事情。Node.js希望无阻塞,这意味着此代码是异步运行的
例如:
for循环运行并将项设置为例如“1”。现在它调用mongoDB函数。到目前为止一切正常。问题是:Node.js不会等待继续for循环直到调用回调函数。for循环将继续。这意味着,该项将获得值,例如“2”现在,当调用回调时,for循环将结束。每个函数都将记录:“2”,因为这是变量的实际值
如果您在回调函数中打印出i的值,您可以看到一个示例。回调函数没有对项的访问权限,但它有第二个参数“docs”包含插入的一个或多个结果。这是回调的概念,当您结束I/O数据库工作时,请用结果调用我。当插入语句成功完成或出现错误时,mongoose将启动回调。您可以将此参数命名为“docs”的任意项。例如结果、结果或项。回调函数无权访问项,但它有第二个参数“docs”包含插入的一个或多个结果。这是回调的概念,当您结束I/O数据库工作时,请用结果调用我。当插入语句成功完成或出现错误时,mongoose将启动回调。您可以将此参数命名为“docs”的任意项。例如结果、结果或项目。此说明非常有用。谢谢!此说明非常有用。谢谢!