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

How to create subdocument on mongodb dynamically

我有一个 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);

现在我的数据库在不断增长,我希望每年有一个 "articles count" 字段

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

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

例如:

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

这确实增加了文章数量,但我不知道在哪里包含 "year"...

最快的方法是什么,我知道我必须获取大量文章(超过 1000 万篇)并且我希望能够 get/update 文章计数有效地给定了一年。

希望我说得够清楚,谢谢!

让你的数组成为一组带有年份和计数的对象:

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

例如

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
    );
}

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