Mongo: запуск .find () и .update () в порядке

1

Я бы хотел:

  1. Получить некоторые предметы из коллекции X;
  2. Получить другие предметы из X;
  3. Обновите элементы из # 1, чтобы иметь то же значение, что и элементы из # 2
  4. Обновите элементы из # 2, чтобы иметь то же значение, что и элементы из # 1

В основном своп.

Однако, когда я пробовал это:

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

Как я могу сделать его синхронным, чтобы результат был таким, каким я ожидаю. Спасибо.

Теги:
asynchronous

2 ответа

1
Лучший ответ

Из того, что я вижу, вы, скорее всего, окажетесь в ситуации, когда курсоры cursorOn и cursorOff работают против живого набора результатов, а не двух отдельных снимков.

Я бы ожидал, что это произойдет:

  1. cursorOn настроен для поиска {"Состояние": "Вкл."}.
  2. cusorOff настроен для поиска {"State": "Off"}.
  3. cursorOn запускает все документы "Вкл.", устанавливая их на "Выкл.".
  4. cursorOff запускает все документы "Выкл.", но это также включает все документы, которые были установлены на "Выкл." на шаге 3.

Конечным результатом является то, что все документы, которые были либо "Вкл.", Либо "Выкл" в начале, были бы переведены на "Вкл.", Как вы заметили.

Вместо того, чтобы иметь дело с курсором, я думаю, вы хотите иметь дело с загруженным массивом, вызывая toArray на самом курсоре. Сочетание этого с projection было бы хорошей идеей, поскольку вам нужны только идентификаторы документов, с которыми вы работаете.

Я не эксперт MongoDB. Это именно то, что проблема выглядит для меня. Я надеюсь, что это помогает.

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();
};

Использование a затем позволяет вам контролировать порядок исполнения, если вы использовали обещание -.when() не будет выполняться до тех пор, пока выполнение.then() не выполнит обещание.

Надеюсь, это поможет чувакам или, по крайней мере, оттолкнуться на какое-то творческое мышление :)

Изменение: забыли включить эту ссылку в jQuery deferred.promise(); Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню