如何动态创建mongodb上的子文档

时间:2015-03-02 20:27:32

标签: node.js mongodb express mongoose

我有一个mongodb数据库,其集合如下:

var mongoose = require('mongoose');
var journalSchema = mongoose.Schema({
  title : String,
  journalid: {type:String, index: { unique: true, dropDups: true }},
  articleCount : type:Number, default:1,
});
module.exports = mongoose.model('Journal', journalSchema);

现在我的数据库正在增长,我希望每年有一个“文章计数”字段

我可以按照years : [{articleCount : Number}]制作一个数组,然后通过访问journal.years[X]特定年份来填充它,其中X对应于1997年的0,1998年的1等等。

但是,我的数据动态报废,我希望在我的快递服务器中有一个功能,articleCount根据年份增加。

例如:

function updateYear(journalid, year, callback) {
  Journal.findOneAndUpdate(
    {'journalid':journalid},
    {$inc : {'articleCount' : 1}}, // DO SOMETHING WITH year HERE
    function() {
      callback();
    });
}

这确实增加了文章数,但我不知道在哪里包含“年”...

最快的方法是什么,知道我必须获取相当多的文章(1000万+),我希望能够有效地获得/更新给定年份的文章计数。

希望我很清楚,谢谢!

1 个答案:

答案 0 :(得分:1)

使您的数组成为一组具有年份和计数的对象:

journalYears: [
    {
        year: String, // or Number
        count: Number
    }
]

e.g。

journalYears: [
    { year: "2014", count: 25 },
    { year: "2015", count: 15 }
]

然后为您的更新:

function updateYear(journalId, year, callback) {
    Journal.findOneAndUpdate(
        {_id: journalId, "journalYears.year": year},
        { $inc: { "journalYears.$.count": 1 } },
        callback
    );
}

您查询中第一个匹配的索引保存在$中。然后它用于更新数组中的特定元素。