Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在没有重复项的情况下更新MongoDB_Javascript_Mongodb_Meteor_Meteor Blaze - Fatal编程技术网

Javascript 如何在没有重复项的情况下更新MongoDB

Javascript 如何在没有重复项的情况下更新MongoDB,javascript,mongodb,meteor,meteor-blaze,Javascript,Mongodb,Meteor,Meteor Blaze,我用的是流星框架和火焰。如何从API中获取数据,并仅在MongoDB集合中插入新数据而不是重复数据 从API获取数据 if (Meteor.isServer) { Meteor.methods({ fetchApiData: function () { this.unblock(); return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/post

我用的是流星框架和火焰。如何从API中获取数据,并仅在MongoDB集合中插入新数据而不是重复数据

  • 从API获取数据

    if (Meteor.isServer) {
        Meteor.methods({
            fetchApiData: function () {
                this.unblock();
                return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/posts');},
    
  • 将数据插入数据库:

    populateDatabaseApi: function () {
      Meteor.call('fetchApiData', function(error, result) {
        myCollection.insert({
          //upsert: true,
          A: result.data.title,
          B: result.data.userId,
          C: result.data.id });
      });
    },
    
  • 当使用“myCollection.update”和“upsert:true”时,它显然不会插入新条目。检查API中的数据并只插入新条目(没有重复项)和更新现有条目的最佳实践是什么


    谢谢。

    我不熟悉您的特定框架,因此我无法帮助您理解语法,但您应该能够找到与您尝试插入的文档具有相同属性的所有文档(应该只有一个)。如果有,则使用
    upsert
    保存它。如果没有,则您保存的对象是唯一的,您应该保存一个新对象。

    以下是我在启动时如何处理所谓的引用数据。它是由JSON数据驱动的。您必须选择一个字段作为每个JSON对象的“引用”,以便查看它是否已经在数据库中

    _.each(ItemData.items, function(q) {
        check(q, ItemsSchema);
    
        Items.upsert({
            item: q.item
        }, {
            $set: {
                item: q.item,
            }
        }, function(error, result) {
            if (error) {
                let errMsg = 'Error while writing item data';
                console.error(errMsg, error);
                throw new Meteor.Error('500', errMsg);
            }
        });
    });
    
    我使用upsert来处理插入与更新。

    仅使用“香草”Meteor,假设您的api对象具有唯一ID,并且您具有正确的数据访问权限(即,如果项目存在,findOne将找到它),我将使用:

    populateDatabaseApi: function () {
          Meteor.call('fetchApiData', function(error, result) {
            var item = myCollection.findOne({A : result.data.id})
            if(item){
               //do nothing, this item already is in the db
            }else{
               myCollection.insert({
                 A: result.data.title,
                 B: result.data.userId,
                 C: result.data.id });
               });
            }
        },
    

    如果你需要保证唯一性,你也应该在数据库中放置适当的唯一索引,如果没有它们,你在meteor中做的任何事情都可能失败。为什么不用简单的方法来做呢?我不确定我是否理解正确。是否必须将标题之类的内容与数据库中的现有条目进行比较?如果
    title
    是集合中唯一的字段,则可以简单地比较标题(或任何其他单个唯一字段,或使文档唯一的两个字段)。但是,如果没有唯一字段,则必须询问数据库是否存在与您试图保存的文档相同的完整文档(自动生成的sans
    id
    \u v
    等字段)