Node.js和猫鼬。从一个集合中读取并写入另一个集合

时间:2020-08-17 19:25:44

标签: node.js mongodb mongoose-schema mongoose-models

我正在尝试从一个Mongo集合中读取数据,然后将所有这些数据保存到新的集合中。我使用的是相同的架构,但是在两个不同的模型中更改了集合名称:

UserInfo.js:

const mongoose = require('mongoose')

const userSchema = mongoose.Schema({
    userID : String,
    userName : String
})

let userInfo = mongoose.model('UserInfo', userSchema)
let backUpUserInfo = mongoose.model('BackUpUserInfo', userSchema)

module.exports = {
    userInfo : userInfo,
    backUpUserInfo : backUpUserInfo
}

我将数据插入到userinfos集合中,然后尝试读取该数据并将其插入到backupuserinfos集合中:

backup.js:

const UserInfo = require('../Schema/UserInfo').userInfo;
const BackUpUserInfo = require('../Schema/UserInfo').backUpUserInfo;

async function backUp(){ 
    UserInfo.find({}, async function(err1, userInfo){   
        if (err1) return console.log(err1) 
        for(let i in userInfo){
            try{
                let backUpUser = new BackUpUserInfo(userInfo[i])
                await backUpUser.save(function (err2, user) {
                    if (err2) return console.error(err2)
                    console.log("collection updated")
                })
            }
            catch(err){
                console.log(err)
            }
        }
    })
}

我收到一个错误,似乎表明在尝试保存信息时找到了重复项,即使备份集合为空。这使我认为它正在尝试写入用户信息集合,而不是备份用户信息集合。我创建了backUp模型变量,这就是我运行时保存的变量,这使我认为应该指定该变量运行到该集合。我在这里做错什么了吗?

这是错误:

VersionError:找不到与ID匹配的文档

1 个答案:

答案 0 :(得分:1)

mongoose中最简单的方法是

UserInfo.aggregate([ { $match: {} }, { $out: "BackupUserInfo" } ])

否则,您可以使用mongodb查询或mongodb copyTo()

db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])

//OR

db.source.copyTo("target"); 

但是从版本3.0开始不推荐使用 copyTo()