Meteor 这是我的代码,当我第一次将多条记录插入我的收藏时,但当我第二次插入多条记录时,它说的是重复的_id,

Meteor 这是我的代码,当我第一次将多条记录插入我的收藏时,但当我第二次插入多条记录时,它说的是重复的_id,,meteor,Meteor,这是我的代码,当我第一次在我的收藏中插入多条记录时,它工作得很好,但当我第二次插入时,它说的是复制id,如何修复它 //Save Journal Detail $("#item-list tr").each(function (e) { //debugger; var yearMonth = $('#journalDate').val(); var da

这是我的代码,当我第一次在我的收藏中插入多条记录时,它工作得很好,但当我第二次插入时,它说的是复制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; 

问题很可能是,
$。每次(
迭代都不会等待
insert
调用完成,因此集合中的最后一个id保持不变,因此
idGenerator.genWithPrefix
为多个连续的insert调用提供相同的id

在Meteor客户端中。因此,在通过
idGenerator.genWithPrefix
获取下一个id之前,您必须等待每次
insert
调用,否则您下一个生成的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]);
    }
  }
});
Meteor.methods({
“insertEntries”:函数(listToInsert,前缀){
对于(变量i=0;i
最好允许集合插入自己的\u id,但如果要手动定义\u id,只需在插入之前检查即可。比如说(!Acc.Collection.JournalDetail.findOne({u id:JournalDetail})){//insert it}顺便问一下,上面的代码在帮助程序或事件中的什么位置?我尝试了你的解决方案,但现在它工作了。有任何帮助哦,对不起,它不工作了。我搞不清楚你在写上面的代码吗?