使用Mongoose更新现有文档的值?

时间:2014-04-06 18:54:10

标签: javascript node.js angularjs mongodb mongoose

我有一个'position'文档字段,用于通过前端的角度循环对结果进行排序。

现在,我的架构准确地自动递增缺少“位置”的新文档,并正确存储具有表单字段输入位置的新文档。

当插入具有现有“位置”值的项目时,我想要将每个记录向下移动。我为此写了一些javascript逻辑,但是如果..

它没有点击其他
// load mongoose since we need it to define a schema and model
var mongoose = require('mongoose');

var ItemSchema = mongoose.Schema({
    title : String,
    position: Number
});

// before validation starts, the number of Items is counted..afterwards, the position is set
ItemSchema.pre("validate", function(next) {

    var doc = this;

    // if 'position' is not filled in, fill it in..not using !position because 0 might be a valid value
    if(typeof doc.position !== "number") {
        // count the number of Items *
        // use mongoose.model to fetch the model because the model is not compiled yet
        mongoose.model("Item").count(function(err, num) {
            // if there was an error, pass it to next()
            if(err)
                return next(err);

            // set the position, then call next();
            doc.position = num;
            return next();
        });
    } else if(doc.position == "number") {

        console.log('yes, a number');

        // check if there is an existing document with the same position
        // use mongoose.model to fetch the model because the model is not compiled yet
        mongoose.model("Item").where({_id: {$ne: doc._id}, position: doc.position}).count( function (err, count) {

            // if there was an error, pass it to next()
            if(err)
                return next(err);

            // if there is a doc with the same position, execute an update to move down all the $gte docs
            if(count > 0) {
                // use mongoose.model to fetch the model because the model is not compiled yet
                mongoose.model("Item").update({position: {$gte: doc.position}}, {position: {$inc: 1}}, {multi: 1}, function(err, numAffected) {

                    console.log(numAffected);

                    // Call next() (with or without an error)
                    next(err);
                });

            } else {
                //  there are no docs that need to move down, so call next()
                next();
            }
        });
    } else {
        //  there is no need to count or update positions, so call next()
        next();
    }
});

module.exports = mongoose.model('Item', ItemSchema);

0 个答案:

没有答案