无法使用mongoose将对象添加到mongodb中的数组中?

时间:2014-06-08 05:10:34

标签: javascript node.js mongodb mongoose mongodb-query

我正在使用nodejs和mongodb创建一个应用程序,我有这个:

var mongoose = require('mongoose');
var db = mongoose.connect("mongodb://localhost/dbTienda");

var esquemaUsuarios = new mongoose.Schema({
nombre: String,
apellido: String,
email: String,
contrasena: String,
notificaciones: Number,
notificacionesLista: [String],
articulos_vendidos: Number,
productos: [{
    nombre: String,
    imgPath: String,
    precio: Number,
    ciudades: [String],
    tags:  [String],
    descripcion: String
}]
}), usuarios = db.model("Usuarios",esquemaUsuarios);

问题在于我无法在productos中添加任何内容,我的想法是制作类似的内容

productos: {
{nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX},
{nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX},
{nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX},
{nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX}
}

我想添加许多对象,例如第一个对象可能是一个celphone,第二个是电视......等等我无法添加任何东西而且我用这个:

mongoose.model('Usuarios').update({
productos:[{$pushAll:{
    nombre: informacion.pNombre,
    imgPath: informacion.pImagen,
    precio: informacion.pPrecio,
    ciudades: informacion.pCiudades,
    tags: informacion.pTags,
    descripcion: informacion.pDescripcion
}},{upsert:true}]
});

但它不起作用!我可以编辑nombre apellido电子邮件等,但我不能用productos。

2 个答案:

答案 0 :(得分:2)

问题在于使用.update()方法,您要使用的实际运算符是$push

update方法将其第一个参数作为查询来“查找”要更新的文档,第二个参数是实际的更新语句。所以在你的情况下:

mongoose.model('Usuarios').update(
    { /* query to match document(s) */ },
    {
        "$push": {
            nombre: informacion.pNombre,
            imgPath: informacion.pImagen,
            precio: informacion.pPrecio,
            ciudades: informacion.pCiudades,
            tags: informacion.pTags,
            descripcion: informacion.pDescripcion
        }
    },
    { upsert:true },
    function(err,numAffected) {

    }
);

如果您的“查询”条件实际上与您馆藏中的任何文件都不匹配,那么您为upsert设置的“选项”将创建一个“新”文档。

如果您的目的不是要更新多个文档,那么您的使用可能更适合.findOneAndUpdate().findByIdAndUpdate()方法。

仅供注释,$pushAll运算符实际上已在近期版本的MongoDB中弃用,首选方法是将$each修饰符与$push结合使用。这是因为此功能也以相同的方式与$addToSet运算符共享。预期用途是一次添加“多个”数组项。

答案 1 :(得分:0)

imho你需要为'productos'定义单独的模式,并在'esquemaUsuarios'中通过引用存储它们,当你需要共享同一产品时,它将为你提供更大的灵活性并节省数据库存储