使用 Mongoose 在集合内的文档中增加和推送新值的有效方法
Posted
技术标签:
【中文标题】使用 Mongoose 在集合内的文档中增加和推送新值的有效方法【英文标题】:Efficient way to Increment and push new value in document inside of a collection using Mongoose 【发布时间】:2018-06-19 07:18:55 【问题描述】:如果新文档不存在于基于单词的集合中,我想保存它,如果它存在,那么我想将其计数增加 1 并在页面内推送一个新值。这个正在工作,但我想要更有效的方法来做到这一点。
我目前的方法:我认为我的代码效率不高
my_model = new mongoose.Schema(
word: String,
count: Number,
page: [String]
);
// 假设 nextWord 是使用 async.eachSeries 来自 wordArrayList 的单词,下面的代码将为每个 nextWord 运行,nextPage 是 nextPage 是包含此 nextWord 的页面
my_model.find(word: nextWord, function(err, data)
if(data.length>0)
my_model.findOneAndUpdate(word:nextWord,$inc:count:1, $push:
page:nextPage,upsert:true, function(err, doc)
if(err) throw err;
console.log('updated!');
);
else
var newModelObj = new my_model(
word: nextWord,
count: 1,
page:[nextPage]
);
newModelObj.save(function(err)
if(err) throw err;
console.log('saved');
);
)
【问题讨论】:
【参考方案1】:有了findOneAndUpdate
和upsert: true
,就不需要外层的find
了。
const wordSchema = new mongoose.Schema(
word:
type: String
,
count:
type: Number
,
pages: [
type: String
]
);
const Word = connection.model('Word', wordSchema);
const words = ['foo', 'bar', 'foo'];
words.reduce((p, word) =>
return p.then(() =>
return Word.findOneAndUpdate(
word
,
$inc:
count: 1
,
$push:
pages: word.toUpperCase()
,
upsert: true,
new: true
).exec().then(res => console.log(res));
);
);
输出:
_id: 1,
word: 'foo',
__v: 0,
count: 1,
pages: ['FOO']
_id: 2,
word: 'bar',
__v: 0,
count: 1,
pages: ['BAR']
_id: 1,
word: 'foo',
__v: 0,
count: 2,
pages: ['FOO', 'FOO']
【讨论】:
以上是关于使用 Mongoose 在集合内的文档中增加和推送新值的有效方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mongoose 将文档插入只有一个 ObjectID 的集合中?
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本