我收到一个/ 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插入。但是,我只有两个。
我不知道哪里出错了。可能是由于回调?
答案 0 :(得分:0)
管理好解决它!
用
替换了所有的async.waterfall代码db.collection('dat')
.updateOne({ tag: newTagNumber },
{ $push : { keywords: keywordObj }},
{ upsert: true })
.then((result) => {
console.log('result is ' + result)
}