我想保存新文档,如果它没有出现在基于单词的集合中,如果它存在,那么希望将其计数增加1并在页面内推送一个新值。这个是有效的,但我想要更有效的方法来做到这一点。
我当前的方法:我认为我的代码效率不高
my_model = new mongoose.Schema({
word: String,
count: Number,
page: [String]
});
//假设nextWord是一个来自wordArrayList的单词,使用async.eachSeries,下面的代码将为每个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');
});
}
})
使用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']
}