MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Meteor - Erreur MongoDB :Impossible d'appliquer le modificateur $addToSet à un non-tableau

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

On dirait que vous essayez d'ajouter un objet à un ensemble. Vous obtenez une erreur sur la simulation. Examinons cette erreur. Le code qui génère une erreur :

https://github.com/meteor/meteor/blob /master/packages/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 { ...

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

Regardez votre code :

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

items est un objet, pas un tableau ! Il sortira une erreur.

Pouvez-vous $addToSet à un objet avec Mongo ? Regardons le code.

https://github.com/mongodb/mongo/blob/4a4f9b1d6dc79d1ba4a4d7eaa9e /db/update.cpp

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

Non! Cela vient de l'ancien code Mongo, car la base de code contemporaine est tentaculaire, mais c'est la même chose.

Je n'ai trouvé qu'un seul insert dans votre code.

'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);
    }
  }
},

Essayez lists.insert({Category:catVal,items:[]}) . Ainsi, les éléments sont initialisés en tant que tableau plutôt qu'en tant qu'objet lors de leur première utilisation.

De plus, je ne pense pas que $addToSet compare les objets dans un tableau comme vous le souhaitez de toute façon, alors pensez à faire une collection séparée Items qui contient un categoryId .

C'est une pure coïncidence qu'il fonctionne à un endroit et pas à un autre.