sql >> Base de Datos >  >> NoSQL >> MongoDB

Meteor - Error de MongoDB:no se puede aplicar el modificador $addToSet a una matriz que no sea

function addItem(list_id, item_name) {
    if(!item_name && !list_id)
      return;
    lists.update({_id:list_id}, {$addToSet:{items:{Name:item_name}}});
  }

Parece que estás tratando de agregar un objeto a un conjunto. Estás recibiendo un error en la simulación. Investiguemos ese error. El código que da error:

https://github.com/meteor/meteor/blob /maestro/paquetes/minimongo/modify.js

 $addToSet: function (target, field, arg) {
    var x = target[field];
    if (x === undefined)
      target[field] = [arg];
    else if (!(x instanceof Array))
      throw Error("Cannot apply $addToSet modifier to non-array");
    else { ...

Uh oh, throw Error("Cannot apply $addToSet modifier to non-array.") .

Mira tu código:

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
...
  items: Object
...

items es un objeto, no una matriz! Saldrá por error.

¿Puedes $addToSet a un objeto con Mongo? Veamos el código.

https://github.com/mongodb/mongo/blob/4a4f9b1d6dc79d1ba4e4eb7eaa0 /db/actualizar.cpp

 case ADDTOSET: {
            uassert( 12592 ,  "$addToSet can only be applied to an array" , in.type() == Array );
            ...
        }

¡No! Esto es del antiguo código de Mongo, porque la base de código contemporánea se está expandiendo, pero lo mismo.

Solo encontré uno insert en tu código.

'keyup #add-category': function(e, t) {
  if (e.which === 13) {
    var catVal = String(e.target.value || "");
    if (catVal) {
      lists.insert({Category:catVal});
      Session.set('adding_category', false);
    }
  }
},

Prueba lists.insert({Category:catVal,items:[]}) . Para que los elementos se inicialicen como una matriz en lugar de un objeto cuando se usaron por primera vez.

Además, no creo que $addToSet compara objetos en una matriz de la manera que le gustaría de todos modos, así que considere hacer una colección separada Items que contiene un categoryId .

Es pura coincidencia que esté funcionando en un lugar y no en otro.