这是我的代码,当我第一次插入多个记录到我的集合它工作,但当我第二次插入它说复制_id,

时间:2015-06-10 03:42:17

标签: meteor

这是我的代码,当我第一次将多条记录插入我的Collection时效果不错,但是当我第二次插入时,它说重复_id,如何修复它。

            //Save Journal Detail
            $("#item-list tr").each(function (e) {
                //debugger;
                var yearMonth = $('#journalDate').val();
                var date = moment(yearMonth).format("YYMM");
                var prefix = curBranch + "-" + date;

                var chartAccountId = $(this).find(".chart-account-id option:selected").val();
                if (chartAccountId == "" || chartAccountId == null) {
                    return;
                }
                var journalDetailId = idGenerator.genWithPrefix(Acc.Collection.JournalDetail, prefix, 8);
                var debit = parseFloat($(this).find(".debit").val());
                var credit = parseFloat($(this).find(".credit").val());
                if (debit > 0) {
                    Acc.Collection.JournalDetail.insert({
                        _id: journalDetailId,
                        journalId: doc._id,
                        chartAccountId: chartAccountId,
                        drCr: debit,
                        split: "Hello"
                    });
                } else {
                    Acc.Collection.JournalDetail.insert({
                        _id: journalDetailId,
                        journalId: doc._id,
                        chartAccountId: chartAccountId,
                        drCr: -credit,
                        split: "Hello"
                    });
                }
            });
            return doc; 

1 个答案:

答案 0 :(得分:0)

问题可能是您的$.each()次迭代不等待insert次调用完成,因此集合中的最后一个ID保持不变,因此idGenerator.genWithPrefix给出你有多个连续插入调用的相同id。

在Meteor客户端中,"insert never blocks"。因此,在通过insert获取下一个ID之前,您必须等待每次idGenerator.genWithPrefix调用,否则您的下一个生成的ID将最终与您开始插入的前一个ID相同。

一个简单的解决方案可能是使用方法调用将该逻辑传输到服务器(其中insert调用阻塞),只需为其提供您希望插入的文档列表。

在客户端:

//Save Journal Detail
var listToInsert = [];
var yearMonth = $('#journalDate').val();
var date = moment(yearMonth).format("YYMM");
var prefix = curBranch + "-" + date;
$("#item-list tr").each(function (e) {
  //debugger;
  var chartAccountId = $(this).find(".chart-account-id option:selected").val();
  if (chartAccountId == "" || chartAccountId == null) {
    return;
  }
  var debit = parseFloat($(this).find(".debit").val());
  var credit = parseFloat($(this).find(".credit").val());
  listToInsert.push({
    journalId: doc._id,
    chartAccountId: chartAccountId,
    drCr: debit > 0 ? debit : -credit, // simplified with a ternary operator
    split: "Hello"
  });
});
Meteor.call("insertEntries", listToInsert, prefix, function () {
  //done!
});
return doc;

在服务器上:

Meteor.methods({
  'insertEntries': function (listToInsert, prefix) {
    for (var i = 0; i < listToInsert.length; i++) {
      listToInsert[i]._id = idGenerator.genWithPrefix(Acc.Collection.JournalDetail, prefix, 8);
      // Since we're on the server, this insert will be blocking
      Acc.Collection.JournalDetail.insert(listToInsert[i]);
    }
  }
});