我需要做findOne并将结果带到一个变量中以插入另一个集合中。 问题在于我有结果的内部功能,而且只是空的。
var rest = [];
function queryCollection(collection, callback, city){
collection.findOne({cidade: city},function(err, result) {
k = 1
if (err) {
console.log(err);
} else if (k > 0) {
console.log(result)//here have result
rest.push(result);
callback();
console.log(rest)//here have result
k - 1;
}
});
}
queryCollection(Location, function(){
console.log(rest);
}, 'FATIMA');
console.log('out', rest)//HERE IS EMPTY, HOW CAN I USE REST VALUE?
答案 0 :(得分:4)
以下是关于javascript的一些注意事项以及使用mongoose的一些示例。我希望它有所帮助!
根据你的问题松散地考虑这个人为的例子:
'use strict';
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;
const testSchema = new Schema({
city: String
});
const Test = mongoose.model('test', testSchema);
const test = new Test({
city: 'Tucson'
});
function queryCollection() {
console.log('queryCollection');
Test.findOne({ city: test.city }, function (err, result) {
console.log('findOne callback');
if (err) {
return console.error(err);
} else {
console.log(`result: ${result}`);
}
});
}
test.save(function (err, doc) {
console.log('save callback');
if (err) { return console.error(err); }
queryCollection();
});
console.log('console.log');
shell输出
stack: node ./49738064.js
console.log
save callback
queryCollection
findOne callback
result: { _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
^C
stack:
请注意,脚本的第一个输出是' console.log'
这是因为test.save()
和Test.findOne()
是异步操作,这意味着他们需要时间来完成javascript不会等待。
读取或写入网络,磁盘或数据库的功能通常称为“异步”和“异步”。除非他们以其他方式记录/命名。您需要在代码中考虑这种同步和异步操作的混合。
历史上,这是通过回调完成的。如果有一些异步操作,则会将回调传递给该操作,该操作将处理异步调用的结果。
从上面回到我们人为的例子:
'use strict';
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;
const testSchema = new Schema({
city: String
});
const Test = mongoose.model('test', testSchema);
const test = new Test({
city: 'Tucson'
});
function queryCollection(done) {
Test.findOne({ city: test.city }, function (err, result) {
if (err) {
return console.error(err);
} else {
done(result);
}
});
}
test.save(function (err, doc) {
if (err) { return console.error(err); }
queryCollection(console.log);
});
正如您所看到的,我将console.log函数作为异步查询操作的回调函数传递。您也可以编写自己的函数并将它们传递给它们。
shell输出
stack: node ./49738064.js
{ _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
^C
stack:
处理异步操作的一种更现代的方法是使用promises。 A Promise是一个对象,表示您正在执行的操作的未来结果。
如果您没有传入回调函数,默认情况下所有的mongoose异步操作都会返回一个promise(或类似promise的对象)。因此,它们可以非常有效地与async / await一起使用。
这是一个使用异步await和mongoose的例子:
'use strict';
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;
const testSchema = new Schema({
city: String
});
const Test = mongoose.model('test', testSchema);
const test = new Test({
city: 'Tucson'
});
function queryCollection() {
return Test.findOne({ city: test.city });
}
async function run () {
await Test.remove({}); // remove all existing documents
await test.save(); // save the new document
let found = await queryCollection();
console.log(found);
}
run();
shell输出
stack: node ./49738064.js
{ _id: 5acbdf5dd8dc39d6065c820c, city: 'Tucson', __v: 0 }
^C
stack: