使用Mongoose在集合内部增加和推送新值的有效方法

问题描述 投票:0回答:1

我想保存新文档,如果它没有出现在基于单词的集合中,如果它存在,那么希望将其计数增加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');
    });
}
})
node.js database mongodb asynchronous mongoose
1个回答
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']
}
© www.soinside.com 2019 - 2024. All rights reserved.