【问题标题】:Unable to add objects into an array in mongodb using mongoose?无法使用 mongoose 将对象添加到 mongodb 中的数组中?
【发布时间】:2017-06-27 11:48:39
【问题描述】:

我正在使用 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}
}

我想添加许多对象,例如第一个对象可能是手机,第二个是电视......等等。我无法添加任何东西,我正在使用这个:

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。

【问题讨论】:

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


    【解决方案1】:

    这里的问题在于.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 运算符共享。预期用途是一次添加“多个”数组项。

    【讨论】:

    • 天哪,非常感谢你,我对这个问题真的很紧张
    【解决方案2】:

    恕我直言,您需要为您的“productos”定义单独的架构,并通过引用将它们存储在“esquemaUsuarios”中,当您需要共享同一产品时,它将为您提供更大的灵活性并节省数据库存储

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2021-07-04
      • 2019-02-13
      • 2020-10-27
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多