javascript - 如何在 MongoDB (Mongoose) 中更新和更新插入文档。 NodeJS

标签 javascript node.js mongodb mongoose

我有一个使用 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) 中更新和更新插入文档。 NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270279/

相关文章:

javascript - 具有不同配置的相同 Passport js 策略 (SAML)

node.js - MongoDB 集合中各个字段的不同值

javascript - CSS- 水平 div 不会在调整大小时堆叠?

Javascript 树结构到数组的转换

arrays - 循环遍历node/jade中的相似键

mongodb - 如何使用 Mongoid 执行 $geoIntersects 查询?

javascript - 以纯文本形式将用户 ID 发送到前端是否安全?

javascript - 如果我没有分页会发生什么?只是继续循环发布...为什么需要分页,用于页脚?

javascript - 为 d3 中的旭日加载内部 JSON 数据而不是从外部资源/文件

javascript - python 到 node.js 的混淆