猫鼬:findByIdAndUpdate:尝试使用名称字段(firstName + lastName)更新所有文档

时间:2019-12-27 03:46:33

标签: node.js mongodb mongoose

我正在尝试使用新字段名更新文档,该字段名必须是同一文档中firstName和lastName的组合。我在这里编写了一个代码段,并尝试更新数据库中的值。它没有更新,没有错误。我曾尝试将_id强制转换为ObjectId,但这没有用。

MongoDB:3.4 猫鼬:4.11.x

const mongoose = require('mongoose')
const User = require('./models/user')

mongoose.connect('mongodb://localhost:27017/db', {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true,
})

const users = User.find({}, function(error, doc){
    doc.forEach(function(raw_doc){
        if(raw_doc.firstName) {
            firstName = raw_doc.firstName
        }else{
            firstName = ''
        }
        if(raw_doc.lastName) {
            lastName = raw_doc.lastName
        }else{
            lastName = ''
        }
        name = firstName + " " + lastName
        const user_update = User.findByIdAndUpdate(raw_doc._id, { name: name }, function(error, res) {
            if (error){
                console.log(error)
            }else{
                console.log(res)
            }
        });
    });
});

2 个答案:

答案 0 :(得分:0)

请尝试:

async function dBConnection() {

    try {
        let dbOp = await Users.find({}).lean(true);
        if (dbOp.length) {
            for (const i of dbOp) {
               const firstName = (i.firstName && (i.firstName).length) ? i.firstName : '';
               const lastName = (i.lastName && (i.lastName).length) ? i.lastName : '';
               const name = firstName + " " + lastName;
               const resp = await Users.findByIdAndUpdate(i._id, { name: name }, { new: true })
                console.log(i._id, '::', resp)
            }
            db.close()
        } else {
            console.log('No users found')
            db.close()
        }
    } catch (error) {
        console.log('Error in DB Op ::', error);
        db.close()
    }
}

module.exports = dBConnection();

答案 1 :(得分:0)

有两种可能的情况: var firstNamelastName在if / else的局部范围内声明。因此,请尝试在父范围中声明它们,然后该值将在name变量中可用。

如果async存在问题,则可以尝试使用Promise处理数据库请求。首先,为数据库请求创建Promises,然后根据请求执行返回(解决,拒绝)。 使用Promise.all()执行所有promise,并处理您的请求的响应。

    let promises = doc.map(raw_doc => {
    return getPromises(raw_doc);
    })
    Promise.all(promises).then().catch()

function getPromises(user_doc) {
let name = '';
return new Promise((resolve, reject) => {
 if(user_doc.firstName) {
   name+= user_doc.firstName+ " ";
 }
 if (user_doc.lastName) {
   name+= user_doc.lastName;
 }
 User.findByIdAndUpdate(user_doc._id, {name: name}, {new: true})
    .then(updatedUser => {
        resolve(updatedUser);
    })
    .catch(error => {reject(error)});
    });
}