【问题标题】:how to make mongodb 'upsert' to insert new documents as well as update existing ones如何使 mongodb 'upsert' 插入新文档以及更新现有文档
【发布时间】:2015-10-03 15:26:12
【问题描述】:

在我的 MEAN 应用程序中,我有一种情况,我正在逐行读取一些 csv 数据,并使用 'upsert' 更新现有记录,以及插入那些与 ' 不匹配的记录CSCOpportunityID' 字段值:

if(metaFields.subjectCategory === 'SalesforceData'){
                            //Here we will use the upsert logic to either insert new, or update existing records

                            for (var i = 0; i < result.length; i++) {
                                //console.log(result[i]);

                                var inserted = 0;

                                for (var i = 0; i < result.length; i++) {
                                    var dataRecord = result[i];

                                    dataRecord.OriginalDocumentName = fileName;
                                    dataRecord.DocumentAuthor = metaFields.documentAuthor;
                                    dataRecord.TabName = tabName;
                                    dataRecord.SubjectCategory = metaFields.subjectCategory;
                                    dataRecord.Subject = metaFields.subject;
                                    dataRecord.DateDocumentProduced = metaFields.dateDocumentProduced;
                                    dataRecord.DateDocumentReceived = metaFields.dateDocumentReceived;
                                    dataRecord.DocumentSubmitter = metaFields.documentSubmitter;
                                    dataRecord.DocumentReviewer = metaFields.documentReviewer;
                                    dataRecord.OriginalSource = metadataFields.originalSource,
                                        dataRecord.DataVersion = metadataFields.dataVersion,
                                        dataRecord.DataFields = newCsvLines[0];

                                    collection.update(
                                    {
                                        CSCOpportunityId: dataRecord.CSCOpportunityID
                                    },
                                        {
                                            $set: {

                                                OriginalDocumentName:   dataRecord.OriginalDocumentName,
                                                DocumentAuthor: dataRecord.DocumentAuthor,
                                                TabName:    dataRecord.TabName,
                                                SubjectCategory:    dataRecord.SubjectCategory,
                                                Subject:    dataRecord.Subject,
                                                DateDocumentProduced:   dataRecord.DateDocumentProduced,
                                                DateDocumentReceived:   dataRecord.DateDocumentReceived,
                                                DocumentSubmitter:  dataRecord.DocumentSubmitter,
                                                DocumentReviewer:   dataRecord.DocumentReviewer,
                                                OriginalSource: dataRecord.OriginalSource,
                                                DataVersion:    dataRecord.DataVersion,
                                                DataFields: dataRecord.DataFields,

                                                CSCOpportunityID : dataRecord.CSCOpportunityID,
                                                OpportunityName: dataRecord.OpportunityName ,
                                                AccountName : dataRecord.AccountName,
                                                OpportunityOwner : dataRecord.OpportunityOwner,
                                                Stage : dataRecord.Stage,
                                                Industry : dataRecord.Industry,
                                                ACV : dataRecord.ACV,
                                                RevenueStartDate : dataRecord.RevenueStartDate,
                                                RevenueTerm : dataRecord.RevenueTerm,
                                                ProbabilityPct : dataRecord.ProbabilityPct,
                                                DealRegion : dataRecord.DealRegion
                                            }
                                        },
                                        {upsert: true},
                                        {multi:true}

                                        //if (++inserted == result.length) {
                                        //    console.log("finished");
                                        //    //db.close();
                                        //}
                                    );
                                }
                            }
                        }

更新部分有效,但插入部分无效,因为当 'CSCOpportunityID' 的值不匹配时,我不知道如何进行插入。

处理这个问题的正确方法是什么?

【问题讨论】:

  • 我想知道更新是如何工作的,因为你在回调参数中放错了{multi:true},更新只会返回一个承诺。
  • 没错。您可以将其发布为答案,我会接受。

标签: node.js mongodb mean-stack


【解决方案1】:

update 方法将第四个参数作为回调函数。由于您提供了一个对象{multi: true},它不会进行任何数据库调用,只会返回一个承诺。正确的语法是:

 collection.update(query, fieldsToSet, {upsert: true, multi: true}, function(err,doc){

 })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多