使用 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】:

有了findOneAndUpdateupsert: 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 将文档移动到另一个集合

使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本

使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本

多边形内的猫鼬地理查询

MongoDB/Mongoose:对同一集合中不同类型的文档使用不同的方案