更新 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 中的整个集合的主要内容,如果未能解决你的问题,请参考以下文章