Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs-IF和ELSE都执行_Node.js_Mongodb - Fatal编程技术网

Node.js nodejs-IF和ELSE都执行

Node.js nodejs-IF和ELSE都执行,node.js,mongodb,Node.js,Mongodb,必须有一种标准的方法来检查文档是否存在,如果不存在则插入。这是我们所有人都做的事情,从时间的黎明开始。但这些例子只显示了半个常规。我不明白。所以我想出了下面的代码。由于某种原因,if和else都会执行。函数不会被调用两次,所以。。。为什么会这样 输出为: Connected correctly to server got doc inserted doc Disconnected from server successfully 代码是: // Use connect method to co

必须有一种标准的方法来检查文档是否存在,如果不存在则插入。这是我们所有人都做的事情,从时间的黎明开始。但这些例子只显示了半个常规。我不明白。所以我想出了下面的代码。由于某种原因,
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');
            });
        }
    });
});
使用
if(doc!=null)
可以识别循环的结束。这意味着,即使您将结果限制为1,第一次迭代将返回您查询的文档,在第二次迭代中,光标将为null,并指示这应该是循环/结果的结束

日志如下所示:

Connected correctly to server
got doc
inserted doc
Disconnected from server successfully
因为您正在else语句中执行异步操作


游标不知道您在查询中的限制。

也许您应该记录游标的大小,或者游标上有一个1的限制,因此我可以理解为什么没有选中它,但是是的-记录游标的大小!你在找一个上插手术吗…?如果找到,则会更新文档,否则会插入新文档。。。否则…语句将只执行其中一个选项。您指定limit=1,因此您希望只得到一个项目。您(正确地)假设其中一个是不正确的,但您猜测
如果。。。然后…
就是错误所在。我猜恰恰相反,你的查询没有返回你认为的结果。你猜怎么着?因为与从库中返回的值相比,基本语言功能不太可能给您带来奇怪的结果。检查您的
光标
。谢谢您的回答。为了回答您的问题-1)我会使用upsert,但我不会,因为我们正在添加时间戳。厄普塞特每次都会成功。2) 检查我的光标。。。好的,我试过了,但是无论记录是否存在,对象看起来都完全一样。其他人也问了同样的问题——我如何得到光标的大小——他们同样感到困惑。很好,我不知道(游标不知道限制)。非常感谢。当你说“识别循环的末端”时,你的意思是
break
脱离循环吗?还是别的什么?(它告诉我,
无法确定中断的目标
返回
也没有效果;
if
else
仍在执行。这意味着没有其他可迭代的结果。例如,这个查询
db.collection('mycoll').find(mydoc).limit(1)可以不返回结果或返回一个结果。如果没有结果,您将在控制台中看到
got doc
。在1结果的情况下,您将看到已经发布的输出。我不是100%确定您想要实现什么,但我建议使用mongo findOne,然后检查doc var是否为null,插入您想要的文档并完全忘记游标迭代。