草庐IT

javascript - 如何在 MongoDB (Mongoose) 中更新和更新文档。 Node JS

coder 2023-11-05 原文

我有一个使用 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 只查找一个项目而不是所有项目。那么请问,你能帮我插入我的第一部分数据,然后用来自服务器的新数据在数据库中“更新”数据吗?

最佳答案

你的插入/更新逻辑可以使用带有 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$

关于javascript - 如何在 MongoDB (Mongoose) 中更新和更新文档。 Node JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270279/

有关javascript - 如何在 MongoDB (Mongoose) 中更新和更新文档。 Node JS的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  8. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  9. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  10. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

随机推荐