【问题标题】:How to update MongoDB with no duplicates如何更新没有重复的MongoDB
【发布时间】:2017-05-31 13:45:24
【问题描述】:

我在 Blaze 中使用 Meteor 框架。如何从 API 获取数据并且只在我的 MongoDB 集合中插入新数据而不是重复数据?

  1. 从 API 获取数据。

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

    populateDatabaseApi: function () {
      Meteor.call('fetchApiData', function(error, result) {
        myCollection.insert({
          //upsert: true,
          A: result.data.title,
          B: result.data.userId,
          C: result.data.id });
      });
    },
    

当使用带有“upsert: true”的“myCollection.update”时,它显然不会插入新条目。检查 API 中的数据并仅插入不重复的新条目并更新现有条目的最佳做法是什么?

谢谢。

【问题讨论】:

  • 如果您需要保证唯一性,您还应该在数据库中放置适当的唯一索引,如果没有它们,您在流星中所做的任何事情都可能会失败。
  • 为什么不直接用Collection.upsert() 来做呢?

标签: javascript mongodb meteor meteor-blaze


【解决方案1】:

这就是我在启动时处理我所谓的参考数据的方式。它是由 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 来处理插入和更新。

【讨论】:

    【解决方案2】:

    我不熟悉您的特定框架,因此无法提供语法方面的帮助,但您应该能够找到与您要查找的文档具有 same 属性的所有文档插入(应该只有一个)。如果有,则使用upsert 保存。如果没有,那么您保存的对象是唯一的,您应该保存一个新对象。

    【讨论】:

    • 不确定我理解正确。我是否必须将诸如标题之类的内容与数据库中的现有条目进行比较?
    • 如果title 是集合中的唯一字段,那么是的,您可以简单地比较标题(或任何其他单个唯一字段,或共同使文档唯一的两个字段)。但是,如果没有唯一字段,那么您必须询问数据库是否存在与您要保存的文档相同的整个文档(没有自动生成的 id__v 等字段)
    【解决方案3】:

    仅使用“香草”流星,假设您的 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 });
               });
            }
        },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2019-04-25
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多