Mongo:按顺序运行.find()和.update()

时间:2017-09-08 15:26:06

标签: javascript mongodb asynchronous

我想:

  1. 从X系列中获取一些物品;
  2. 从X获取其他物品;
  3. 更新#1中的项目,使其与#2
  4. 中的项目具有相同的值
  5. 更新#2中的项目,使其与#1
  6. 中的项目具有相同的值

    基本上是交换。

    然而,当我尝试这个时:

    var cursorOn = db.car.find({T: 'e46dba7', State: "On"});
    var cursorOff = db.car.find({T: 'e46dba7', State: "Off"});
    
    while (cursorOn.hasNext()) {
        doc = cursorOn.next();    
        db.car.update(
            {_id: doc._id},
            {$set:{"State": "Off"}},
            {writeConcern: { wtimeoutMS: 50000 }}
        );
    }
    
    while (cursorOff.hasNext()) {
        doc = cursorOff.next();    
        db.car.update(
            {_id: doc._id},
            {$set:{"State": "On"}},
            {writeConcern: { wtimeoutMS: 50000 }}
        );
    }
    

    所有记录都更新为On,而不是每个相应组的值被换掉"。

    我也试过这个:

    let cursorOn = await db.car.find({T: 'e46dba7', State: "On"});
    let cursorOff = await db.car.find({T: 'e46dba7', State: "Off"});
    

    这会导致错误:

    SyntaxError: Unexpected identifier at /root/MongoScripts/update.js
    

    如何使其同步,以便结果如我所料。谢谢。

2 个答案:

答案 0 :(得分:1)

我不是一个jQuery延迟专家,但我用它来制作逻辑同步

$.when(firstFuntion).then(secondFunction);
​
function firstFunction (cursorOn) {

    var $dfd = $.Deferred()

    while (cursorOn.hasNext()) {
        doc = cursorOn.next();    
        db.car.update(
            {_id: doc._id},
            {$set:{"State": "Off"}},
            {writeConcern: { wtimeoutMS: 50000 }}
        );
    }

    return $dfd.promise()
}

function secondFunction (cursorOff) {

    var $dfd = $.Deferred();

    while (cursorOff.hasNext()) {
        doc = cursorOff.next();    
        db.car.update(
            {_id: doc._id},
            {$set:{"State": "On"}},
            {writeConcern: { wtimeoutMS: 50000 }}
        );
    }

    return $dfd.promise();
};

使用when然后允许您控制执行的顺序,只要您使用了一个承诺 - .when()将不会执行,直到.then()已经履行了承诺。

我希望这有助于家伙,或至少激发一些创造性思维:)

修改:忘记将此链接添加到jQuery deferred.promise();我希望它有用。

答案 1 :(得分:1)

从我所看到的情况来看,您最终可能会遇到cursorOncursorOff游标正在处理实时结果集的情况,而不是两个单独的快照。

我希望会发生这种情况:

  1. cursorOn设置为查找{“State”:“On”}。
  2. 设置
  3. cusorOff以查找{“State”:“Off”}。
  4. cursorOn遍历所有“开启”文档,将它们全部设置为“关闭”。
  5. cursorOff会遍历所有“关闭”文档,但这也包括步骤3中设置为“关闭”的所有文档。
  6. 最终结果是,如您所见,所有在开始时“开启”或“关闭”的文档都会切换为“开启”。

    我认为你不想处理游标,而是想通过在游标本身上调用toArray来处理一个急切加载的数组。将其与projection相结合将是一个好主意,因为您只需要您正在使用的文档的ID。

    我不是MongoDB专家 - 这就是我遇到的问题。我希望它有所帮助。