我想:
基本上是交换。
然而,当我尝试这个时:
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
如何使其同步,以便结果如我所料。谢谢。
答案 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)
从我所看到的情况来看,您最终可能会遇到cursorOn
和cursorOff
游标正在处理实时结果集的情况,而不是两个单独的快照。
我希望会发生这种情况:
cursorOn
设置为查找{“State”:“On”}。cusorOff
以查找{“State”:“Off”}。cursorOn
遍历所有“开启”文档,将它们全部设置为“关闭”。cursorOff
会遍历所有“关闭”文档,但这也包括步骤3中设置为“关闭”的所有文档。最终结果是,如您所见,所有在开始时“开启”或“关闭”的文档都会切换为“开启”。
我认为你不想处理游标,而是想通过在游标本身上调用toArray
来处理一个急切加载的数组。将其与projection
相结合将是一个好主意,因为您只需要您正在使用的文档的ID。
我不是MongoDB专家 - 这就是我遇到的问题。我希望它有所帮助。