必须有一种标准方法来检查文档是否存在,然后在不存在的情况下插入。从时间的黎明开始,这就是我们所做的一切。但那里的例子只显示了半个例程。我不明白。所以我提出了以下代码。出于某种原因,if
和else
都会执行。该功能不会被调用两次,所以...为什么会这样?
输出结果为:
Connected correctly to server
got doc
inserted doc
Disconnected from server successfully
代码是:
// Use connect method to connect to the Server
mongoClient.connect(url, function (err, db) {
assert.equal(null, err);
console.log("Connected correctly to server");
var cursor = db.collection('mycoll').find(mydoc).limit(1);
// i need 'each' in order to test if doc exists.
// will execute once because i said limit 1.
cursor.each(function (err, doc) {
if (doc != null) {
console.log("got doc");
}
else {
mydoc.date_submit = new Date();
db.collection('mycoll').insertOne(mydoc, function (err, r) {
assert.equal(1, r.insertedCount);
console.log("inserted doc");
db.close();
console.log('Disconnected from server successfully');
});
}
});
});
答案 0 :(得分:3)
拥有if (doc != null)
,您可以识别循环的结束。这意味着即使您将结果限制为1,第一次迭代将返回您查询的文档,在第二次迭代中,游标将为null并指示这应该是循环/结果的结束。
日志就是这样:
Connected correctly to server
got doc
inserted doc
Disconnected from server successfully
因为您正在else语句中执行异步操作。
Cursor不知道您的查询限制。