2016-09-22 8 views
0

Я получаю поток/r/n завершенных данных, которые я хочу вставить в базу данных mongodb.Мой код 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"} ] 
} 

суть моего nodejs/клиента Монго (родной) код с помощью асинхронной выглядит следующим образом:

i. проверьте коллекцию ('dat') на наличие тега.
ii. если тега не существует, создайте документ и вставьте номер тега
iii. затем вставьте ключевое словоObj.

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 ключевых слова для ввода ключевых слов в массив ключевых слов. Тем не менее, я получаю только два.

Я не уверен, где я ошибся. Может быть, это связано с обратными вызовами?

+0

я думаю, что это проблема у меня есть - http://stackoverflow.com/questions/17637274/mongodb-doesnt-save-all-data – extensa5620

ответ

0

Удалось выяснить!

заменить весь код async.waterfall с

db.collection('dat') 
    .updateOne({ tag: newTagNumber }, 
      { $push : { keywords: keywordObj }}, 
      { upsert: true }) 
    .then((result) => { 
    console.log('result is ' + result) 
    } 
Смежные вопросы