只有第一个子文档添加到MongoDB模型中

时间:2014-02-01 21:57:38

标签: node.js mongodb mongoose

我有一个看起来像这样的Mongoose模型:

var ProjectSchema = new Schema({
    name: String,
    slug: String,
    dateCreated: { type: Date, default: new Date() },
    dateUpdated: { type: Date, default: new Date() },
    createdByUserId: Schema.Types.ObjectId,
    screens: [Schema.Types.Mixed]
});

我有一个看起来像这样的类方法:

ProjectSchema.statics.saveElementProperties = function(slugName, screenIndex, elementId, props, callback) {
    var Project = mongoose.model('Project');

    var updateProject = function(project) {
        // Init empty objects if missing
        project.screens[screenIndex] = project.screens[screenIndex] || {};
        project.screens[screenIndex].elements = project.screens[screenIndex].elements || {};
        project.screens[screenIndex].elements[elementId] = project.screens[screenIndex].elements[elementId] || {};
        // Apply properties
        project.screens[screenIndex].elements[elementId] = "Dummy Project Data";
        console.log('elements before save:', project.screens[screenIndex].elements);
        project.save(callback);
    };

    Project.findOne({ slug: slugName }, function(err, project) {
        if (!project) {
            project = new Project({ name: slugName, slug: slugName });
        }
        updateProject(project);
    });
};

当我调用方法saveElementProperties时会发生这种情况:

  1. 我第一次运行此方法时,它的工作方式应该如此;在运行时(保存前的'元素:'日志语句)和使用project.screens[screenIndex].elements客户端检查MongoDB数据库时,mongo添加了一个新对象。
  2. 第二次,第二个对象在运行时添加到project.screens[screenIndex].elements,但此对象永远不会持久保存到MongoDB。
  3. 第三次,对象1和3在运行时project.screens[screenIndex].elements中可见,但第三个对象永远不会持久存储到MongoDB。
  4. 导致此行为的原因是什么?

    MAJOR UPDATE:我重写了整个持久性机制,以减少运行频率,而是用更新的结构替换整个project.screens[screenIndex].elements对象:

    ProjectSchema.statics.saveScreenProperties = function(slugName, screenIndex, elements, callback) {
        console.log('saveScreenProperties:', slugName, screenIndex);
        var Project = mongoose.model('Project');
    
        var updateProject = function(project) {
            // Init empty objects if missing
            project.screens[screenIndex] = project.screens[screenIndex] || {};
            project.screens[screenIndex].elements = elements;
            // Mark as modified and save
            project.markModified('screens.' + screenIndex);
            project.save(callback);
        };
    
        Project.findOne({ slug: slugName }, function(err, project) {
            if (!project) {
                project = new Project({ name: slugName, slug: slugName });
                console.log('  creating new project');
            }
            updateProject(project);
        });
    };
    

    但是,它仍然显示相同的行为 - 它存储了初始elements对象,但后来没有更改它。

1 个答案:

答案 0 :(得分:0)

问题是你正在操纵对象,就像在标准代码中一样,但是mongoose不是'持久性引擎'它是ODM。因此,您需要使用提供的方法来更新数据存储区。

您需要使用更新运算符 $ push 到阵列上。猫鼬也有一些类似的方法。最多的解释性文档在MongoDB网站上。

http://docs.mongodb.org/manual/reference/operator/update-array/

http://docs.mongodb.org/manual/reference/operator/update/

http://docs.mongodb.org/manual/reference/method/db.collection.update/#db.collection.update