首页 > 解决方案 > Node.js 和猫鼬。从一个集合中读取并写入另一个集合

问题描述

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

用户信息.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 集合中:

备份.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)
            }
        }
    })
}

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

这是错误:

VersionError:没有找到与 id 匹配的文档

标签: node.jsmongodbmongoose-schemamongoose-models

解决方案


最简单的方法mongoose

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

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

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

//OR

db.source.copyTo("target"); 

copyTo()自 3.0 版以来已弃用。


推荐阅读