我的mongodb代码不会插入所有数据

时间:2016-09-22 15:36:45

标签: node.js mongodb

我收到一个/ r / n终止数据流,我希望将其插入到mongodb数据库中。

tag~4~keyword~sim
tag~5~keyword~mib
tag~4~keyword~gom
tag~3~keyword~qbo
tag~6~keyword~qqq
tag~3~keyword~k94
tag~4~keyword~g93

我使用arr.split(〜)将它们分开,所以我得到数组表示,其中第一行将表示如下:

arr[0] refers to tag
arr[1] refers to 4 
arr[2] refers to keyword
arr[3] refers to sim

我想用这种表示法将它们插入到mongodb中:

{ 
  tag: 4,
  keywords: [{ keyword: "sim" }, { keyword: "gom" }, { keyword: "g93"} ]
}

使用async的nodejs / mongo客户端(本机)代码的要点如下:

我。检查集合(' dat')是否存在标签 II。如果标签不存在,则创建一个文档并插入标签号
III。接下来插入keywordObj。

var newTagNumber = parseInt(arr[1])
var keywordObj = { keyword: arr[3] }    
async.waterfall([
  function(callback) {
    db.collection('dat')
            .find({ tag: newTagNumber },
             { forceServerObjectId: true}).toArray((err, result) => {
               db.collection('dat').createIndex({ tag: 1 }, { unique: true })
      if (err) return callback(err)
      if (!result.length) return callback(null, false)
    })
 },
 function(arg1, callback) {
   if (!arg1) {
     db.collection('dat')
             .insertOne({ tag: newTagNumber },
              { forceServerObjectId: true }, (err, result2) => {
       if (err) return callback(err)
     })  
   } // end if

   // insert keyword object into the correct tag
   db.collection('dat')
           .updateOne({ tag: newTagNumber },
           { $push : { keywords: keywordObj }},
           { forceServerObjectId: true }, (err, result3) => {
             if (err) return callback(err)
           })
   }],
 function(err) {
   if (err) {
     if (err.message) {
       return console.log(err.message)
     }
     return console.log(err)
   }
 })

使用标签4作为示例,我应该在关键字数组中有3个keywordObj插入。但是,我只有两个。

我不知道哪里出错了。可能是由于回调?

1 个答案:

答案 0 :(得分:0)

管理好解决它!

替换了所有的async.waterfall代码
db.collection('dat')
  .updateOne({ tag: newTagNumber },
             { $push : { keywords: keywordObj }},
             { upsert: true })
  .then((result) => {
    console.log('result is ' + result)
  }