将文档保存到 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
字段。
使用async
await
时最好不要使用回调,使用try
catch
我正在尝试使用 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
字段。
使用async
await
时最好不要使用回调,使用try
catch