Обновить всю коллекцию в MongoDB Node Js - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть программа, которая получает Новый файл с FTP-сервера через некоторое заданное c время, я вставляю данные нового обновленного файла в свою базу данных MongoDB поля остаются неизменными , только изменения данных в новом файле. Теперь проблема в том, что КАЖДЫЙ ВРЕМЯ Я должен вставить всю новую коллекцию в базу данных, и коллекция соответственно увеличивается. Forexample- данные в первый раз из 20 записей, второй раз 40, затем 60 и т. д. Я хочу проверить, какие данные поля обновляются в Новый файл , прежде чем вставлять новые данные FILE и должен только обновлять данные этих полей в базе данных, а не вставлять весь новый документ. MON GOOSE или 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 Ответ

0 голосов
/ 15 февраля 2020

Похоже, вам нужно upsert означает обновление, если документ / запись существует, или вставьте / создайте его.

Таким образом, это может быть сделано либо 1 документом за один раз, либо навалом, но сначала потребуется запрос, чтобы найти соответствующий документ (ы).

Так как вы не предоставили примерные данные, поэтому я не могу написать пример кода для вас, но вот ссылка, чтобы получить вас запущен, для массовых: Bulk.find.upsert и для одного документа эта ветка хороша: how-do-i-update-upsert-a-document-in-mon goose

Обновление: вот массовое обновление 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

Дополнительные сведения:

Клон узла-чит массовое обновление , запуск node bulk-update.js, за которым следует npm install mongodb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...