更新 MongoDB 节点 Js 中的整个集合

Posted

技术标签:

【中文标题】更新 MongoDB 节点 Js 中的整个集合【英文标题】:Update Entire Collection In MongoDB Node Js 【发布时间】:2020-02-15 08:02:13 【问题描述】:

我有一个程序在特定时间后从 FTP 服务器接收 New 文件,我将新更新文件的数据插入我的数据库 MongoDB 字段保持不变,只有新文件中的数据发生变化。现在的问题是每次我都必须将整个新集合插入数据库,并且集合相应增加。例如-第一次数据有 20 条记录,第二次是 40 条,然后是 60 条,依此类推。我想做的是在插入新 文件 之前检查 新文件 中哪个字段的数据已更新strong> 数据,并且应该只更新数据库中这些字段的数据,而不是插入整个新文档。 MONGOOSE 或 MONGODB 是否为此提供解决方案,意味着 如果我将数据作为参数传递,它应该将我现有的集合与我的新集合进行比较数据,然后仅更新已更新字段 ..请帮帮我,我卡住了,谢谢:)。我正在使用 NODE JS ...

var c = new Client();
            var connectionProperties = 
                host: 'ABC',
                user: 'ABC',
                port: 'ABC',
                password: 'ABC',
            ;
            c.connect(connectionProperties);
          c.on('ready', function () 
                c.get('path-to-excel-file', function (err, stream) 
                    if (err) throw err;
                    stream.once('close', function () 
                        const workBook = XLSX.readFile('Convertedfile.xlsx');
                        XLSX.writeFile(workBook, 'Convertedfile',  bookType: "csv" );
                        csv()
                            .fromFile("Convertedfile")
                            .then((jsonObj) => 
                                Model.collection.insert(jsonObj, function (err, docs) 
                                    if (err) 
                                        return console.error(err);
                                     else 
                                        console.log("All Documents insterted");
                                    
                                );
                            )
                        c.end()
                    );
                    stream.pipe(fs.createWriteStream('ConvertedFile.xlsx'))
                )
          )

【问题讨论】:

【参考方案1】:

看起来你需要 upsert 意味着如果文档/记录存在则更新或插入/创建它。

因此,这可以一次完成 1 个文档或批量完成,但需要先进行查询才能找到匹配的文档。

由于您没有提供任何示例数据,因此我无法为您编写示例代码 sn-p,但这里是帮助您入门的链接,批量:Bulk.find.upsert 和单个文档,此线程很好:how-do-i-update-upsert-a-document-in-mongoose

更新:这里是 mongodb 批量更新插入:

const mongo = require('mongodb');
const MongoClient = mongo.MongoClient;

const client = new MongoClient('mongodb://127.0.0.1:27017',  useUnifiedTopology: true );
client.connect(async err => 
    if (err) 
        console.log('DB Connection Error ', err);
     else 
        const db = client.db('node-cheat-db');

        // lets assume you've read all file contents and data is now ready for db operation
        let records = [
            first: 'john', last: 'doe', email: 'johen@doe.com',
            first: 'jack', last: 'doe', email: 'jack@doe.com',
            first: 'jill', last: 'doe_updated', email: 'jill@doe.com'
        ];

        // prepare bulk upsert so that new records are created and existing are updated
        let bulk = db.collection('users').initializeOrderedBulkOp();
        for (var i = 0; i < records.length; i++) 
            bulk.find(
        "email": records[i].email // at least 1 key should be treated as PK; in this example email is PK
        ).upsert(records[i]).replaceOne(records[i]);
        
        bulk.execute(function (err,updateResult) 
                if (updateResult.result.ok != 1) 
                    console.log('Bulk Upsert Error');
                 else 
                    console.log(`Inserted: $updateResult.result.nUpserted and Updated: $updateResult.result.nModified`);
                
        );
    
);

示例输出如下所示:

插入:0 并更新:3

更多详情:

克隆节点作弊bulk-update,运行node bulk-update.js,然后运行npm install mongodb

【讨论】:

感谢您的链接,它确实帮助我从某个地方开始.. 我已经用我的代码更新了问题,所以你能指导我如何在我的代码中实现这一点.. 稍微解释一下我在做 !首先,我从 FTP 服务器接收 EXCEL 文件,将其转换为 CSV,然后将 CSV 数据添加到数据库中 好吧@rizwanraza,我已经添加了代码,它显示了如何处理批量 upsert。希望现在有帮助!

以上是关于更新 MongoDB 节点 Js 中的整个集合的主要内容,如果未能解决你的问题,请参考以下文章

如何更新meteor.js中的Mongodb集合?

在实时 mongodb 机器上更新(或替换)整个数据库集合的最佳方法是啥?

如何在mongodb中重命名整个集合中的一个元素名称

如何更新数据库中的整个Backbone.js集合?

如何在节点js中将变量名作为mongodb的集合名称传递

如何使用节点js在mongodb中映射两个集合[重复]