【问题标题】:Mongoose model doesn't work well猫鼬模型效果不佳
【发布时间】:2015-08-28 08:07:18
【问题描述】:

这些天,我正在为一个项目工作,该项目需要使用 NodeJS 和 MongoDB 保留一些有关分析的信息。

当我尝试发送 JSon 数据时,一些部分被保存到数据库中,但大部分数据都丢失了。我不明白我在哪里做错了。我对这些技术没有足够的背景知识。

这是我的 Mongoose.model;

module.exports = mongoose.model('Products', new Schema({
    unique: Number,
    total: Number,
    hits: {
        String: {
            unique: Number,
            total: Number,
            users:[String]
        }
    }
}));

这是我的创建函数;

var mongoose = require('mongoose'),
    Product = require('../models/products.models')

/**
 * Create a Product
 */
exports.create = function(req, res) {
    var product = new Product(req.body);

    product.save(function(err) {
        if (err)
            return res.status(400);
        else
            res.status(201).json(product);
    });
};

这是我尝试发布的内容;

{
    "unique" : 50,
    "total" : 150,
    "hits" : {
        "11.06.2015" : {
            "unique" : 50,
            "total" : 60,
            "users" : [ 
                "kris", 
                "mark", 
                "jom", 
                "alpi"
            ]
        },
        "12.06.2015" : {
            "unique" : 50,
            "total" : 90,
            "users" : [ 
                "kris", 
                "mark", 
                "jom"
            ]
        }
    }
}

【问题讨论】:

  • 究竟什么是丢失/没有得到保存?
  • @laggingreflex 当我尝试发布上述数据时,“点击”部分没有得到保存。

标签: json node.js mongodb mongoose


【解决方案1】:

使用猫鼬类型Mixed

new Schema({
    unique: Number,
    total: Number,
    hits: {}
}

Mixed 一种“随心所欲”的 SchemaType,它的灵活性是以更难维护为代价的。 Mixed 可以通过 Schema.Types.Mixed 或通过传递一个空的对象文字来获得。以下是等价的:

var Person = new Schema({ any: {} });
var Person = new Schema({ any: Schema.Types.Mixed });

由于它是无模式类型,您可以将值更改为您喜欢的任何其他值,但 Mongoose 失去了自动检测/保存这些更改的能力。

要“告诉”Mongoose Mixed 类型的值已更改,请调用文档的 .markModified(path) 方法,将路径传递给刚刚更改的 Mixed 类型。

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

===============
“猫鼬”:“^4.0.3”,
mongodb版本v2.6.6

var Product = mongoose.model('Products', new mongoose.Schema({
    unique: Number,
    total: Number,
    hits: {}
}));

var product = new Product({
    "unique" : 50,
    "total" : 150,
    "hits" : {
        "11-06-2015" : {
            "unique" : 50,
            "total" : 60,
            "users" : [
                "kris",
                "mark",
                "jom",
                "alpi"
            ]
        },
        "12-06-2015" : {
            "unique" : 50,
            "total" : 90,
            "users" : [
                "kris",
                "mark",
                "jom"
            ]
        }
    }
});
product.save(function(err,p){
   console.log(err,p);
    Product.find(function(err,p){
        console.log(err,p)
    })
})

它对我来说可以正常工作。 由于mongoose抛出错误[MongoError: key 12.06.2015 must not contain '.'],我把12.06.2015改成12-06-2015

【讨论】:

  • 我试过但没有用。无法得到任何响应,例如无限循环。 @Jinceon
  • @aeKynr 检查编辑。你能更详细地描述你这次遇到的无限循环错误吗?另外,您是否确保按照答案中的建议使用product.markModified
  • @laggingreflex 非常感谢。由于“.(dot)”而出现问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2018-03-04
  • 2018-07-15
  • 2014-12-09
  • 2018-12-23
  • 2018-06-23
  • 2020-09-05
相关资源
最近更新 更多