【问题标题】:How to update and upsert documents in MongoDB (Mongoose). NodeJS如何在 MongoDB (Mongoose) 中更新和更新文档。节点JS
【发布时间】:2018-01-16 13:07:22
【问题描述】:

我有一个使用 GET 请求从服务器获取数据的服务。我每 10 秒重复一次此请求,每次请求后我将这些数据保存到我的数据库中。我的代码附在下面。 但是我需要过滤从服务器接收到的新数据,以免在数据库中重复数据。我读到我需要使用upset: true 在我的数据库中进行更新,但我想我做错了什么。你能帮我完成这个任务吗? app.js 代码:

const Tenders = require('./libs/mongoose');
const request = require('request');

let url = `http://public.api.openprocurement.org/api/2.4/tenders?offset=${new Date().toISOString()}+02.00`;

function getTenders() {
  request(url, { json: true }, (err, res, body) => {
    if (err) {
      return console.log(err);
    }
    url = `http://public.api.openprocurement.org/api/2.4/tenders?offset=${body.next_page.offset}`;

    const tendersList = [];
    let tendersData = new Tenders({ tenderId: String, tenderDate: String });

    body.data.forEach((item) => {
      tendersData = {
        tenderId: item.id,
        tenderDate: item.dateModified,
      };
      tendersList.push(tendersData);
    });

    Tenders.findAll({ tenderId: tendersData.tenderId }, (err, tenderId) => {
      if (!tenderId) {
        Tenders.insertMany(tendersList)
          .then((item) => {
            console.log('Saved to db');
          })
          .catch((err) => {
            console.log(err);
          });
      } else {
        console.log('Data is already in db');
      }
    });
  });
}

getTenders();
setInterval(getTenders, 10000);

以防万一 mongoose.js:

const mongoose = require('mongoose');
const config = require('../config');

mongoose.Promise = global.Promise;
mongoose.connect(
  config.get('mongoose:uri'),
  { useMongoClient: true },
);

const tender = new mongoose.Schema({
  tenderId: String,
  tenderDate: String,
});

const Tenders = mongoose.model('Tenders', tender);

module.exports = Tenders;

我猜我的带有Tenders.find....Tenders.insertMany 的代码只查找一项而不是全部。那么请您帮我插入我的第一部分数据,然后在数据库中使用来自服务器的新数据“更新”数据?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    您的插入/更新逻辑可以使用带有 upsert 标志 true 的更新函数来简化

    这是一个实现,(希望tenderId被索引)

    const TenderSchema = new Schema({ tenderId: String, tenderDate: String });
    const Tender = mongoose.model('Tender', TenderSchema, 'tenders');
    
    var tenders = [
        {tenderId :'tender-1', tenderDate : '1-1-2018'},
        {tenderId :'tender-2', tenderDate : '2-1-2018'},
        {tenderId :'tender-3', tenderDate : '3-1-2018'},
        {tenderId :'tender-2', tenderDate : '4-1-2018'},
        {tenderId :'tender-1', tenderDate : '5-1-2018'},
        {tenderId :'tender-2', tenderDate : '4-1-2018'}
    ];
    
    for (var t of tenders){
        Tender.update(
            {'tenderId' : t.tenderId }, 
            {$set : t}, 
            {upsert : true, multi : true}, 
            function(err, doc){
                    if(err) throw err;
                    console.log(doc);
            }
        )
    }
    

    收藏

    > db.tenders.find()
    { "_id" : ObjectId("5a5d87d8a5f292efd566d186"), "tenderId" : "tender-1", "__v" : 0, "tenderDate" : "5-1-2018" }
    { "_id" : ObjectId("5a5d87d8a5f292efd566d187"), "tenderId" : "tender-2", "__v" : 0, "tenderDate" : "4-1-2018" }
    { "_id" : ObjectId("5a5d87d8a5f292efd566d188"), "tenderId" : "tender-3", "__v" : 0, "tenderDate" : "3-1-2018" }
    > 
    

    控制台日志

    saravana@ubuntu:~/node-mongoose$ node so4.js
    `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or`createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
    Mongoose: tenders.update({ tenderId: 'tender-1' }, { '$set': { tenderId: 'tender-1', tenderDate: '1-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    Mongoose: tenders.update({ tenderId: 'tender-2' }, { '$set': { tenderId: 'tender-2', tenderDate: '2-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    Mongoose: tenders.update({ tenderId: 'tender-3' }, { '$set': { tenderId: 'tender-3', tenderDate: '3-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    Mongoose: tenders.update({ tenderId: 'tender-2' }, { '$set': { tenderId: 'tender-2', tenderDate: '4-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    Mongoose: tenders.update({ tenderId: 'tender-1' }, { '$set': { tenderId: 'tender-1', tenderDate: '5-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    Mongoose: tenders.update({ tenderId: 'tender-2' }, { '$set': { tenderId: 'tender-2', tenderDate: '4-1-2018' }, '$setOnInsert': { __v: 0 } }, { multi: true, upsert: true })
    { n: 1, nModified: 1, ok: 1 }
    { n: 1, nModified: 1, ok: 1 }
    { n: 1, nModified: 0, ok: 1 }
    { n: 1, nModified: 1, ok: 1 }
    { n: 1, nModified: 1, ok: 1 }
    { n: 1, nModified: 0, ok: 1 }
    ^C
    saravana@ubuntu:~/node-mongoose$
    

    【讨论】:

    • 是的,我已将 index: true 添加到tenderId。我会尝试使用您的解决方案
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2017-01-06
    • 2017-04-07
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2018-04-05
    相关资源
    最近更新 更多