将文档保存到 mongoDB 防止重复

saving documents to mongoDB preventing duplicates

我正在尝试使用 mongoose 在 mongodb 中保存多个文档;而且我也愿意防止重复。我的函数看起来像这样:

const Stock = require('./models/stock')
let _symbol = 'symb'

const writeToDB = async (dataObj) => {
    try {

        let stock = await Stock.find({symbol : _symbol } , function (err) {
            if(err) return null
        })

    if (!stock) {
        stock = new Stock({
            dataObj
        })
        await stock.save()
        console.log(`${symbol} is successfully saved to database`)
    } else {
        stock = await Stock.updateMany(
            dataObj, function (err) {
            if (err) {
                console.log(err)
            } else {
                console.log(`${symbol} successfully added`)
            }
        })
    }
    } catch (error) {
        console.log(error)
    }
    
}

但我一直收到超时错误。谁能告诉我哪里出了问题。

更新

使用处理良好的连接方法findOneAndUpdate()工作正常

我认为防止重复值的最佳、简单和容易的方法是在架构中使用 unique 值。

因此您的 Stock 架构必须具有与此类似的内容:

symbol:{
  type: String, // or whatever
  unique: true
}

如果您尝试插入两个具有相同值的对象,mongoose 将抛出如下错误:

MongoError: E11000 duplicate key error dup key: { : "repeatedSymbol" }

您还可以查看 documentation

使用 upsert 选项,在 findOneAndUpdate() 中。如果 upsert 找到与过滤器匹配的文档,它的行为就像普通的 findOneAndUpdate() 一样。但是,如果没有文档匹配过滤器,MongoDB 将通过组合过滤器和更新插入一个,如下所示

var query = {symbol : _symbol };

try{
   let result = await Stock.findOneAndUpdate(query, dataObj, {upsert: true})
}
catch(err){
  console.log();
}

如果你有一个大集合,为了提高速度 findOneAndUpdate(),你应该索引 symbol 字段。

使用asyncawait时最好不要使用回调,使用trycatch