mongoose findOneandUpdate дважды запускается внутри findOne - PullRequest
0 голосов
/ 16 мая 2018

Я использую async eachSeries и обновляю документ, когда он присутствует. Вот пример кода.

let a = [ 
 { user_name: "foo" } 
];
async.eachSeries(a, (doc, done) => {

    Foo.findOne(doc).lean(true).exec((err, doc) => {

        if (err) return done(err);
        Foo.findOneAndUpdate(a, {
                user_last: "bar"
            }, {
                upsert: true,
                new: true
            },
            (err, doc) => {
                if (err) return done(err);
                return done(doc);
            });
    });
}, (err) => {
    console.log(completed);
});

иногда даже массив a имеет один элемент, функция findOneAndUpdate выполняется дважды за одну итерацию. Я использую node v6.10 и mongoose. Это не происходит все время.

Кто-нибудь сталкивался с подобной проблемой.

1 Ответ

0 голосов
/ 18 мая 2018

Вы можете упростить ваш код, например

let arr = [ 
    { user_name: "foo" } 
];

async.eachSeries(arr, (query, done) => {
    // note the removal of lean() as we want a document to use .save()
    Foo.findOne(query).exec((err, doc) => {
        if (err) 
            return done(err);
        // if no document is found, judging by your code you want to create a new document
        if (!doc) {
            doc = new Foo();
        }
        // at this point you will have an existing or new document
        doc.user_last = "bar";
        doc.save(done);
    });
}, (err) => {
    if (err)
        console.log(err);
    else
        console.log('completed');
});
...