sql >> Database >  >> NoSQL >> MongoDB

Meteor - MongoDB-fout:kan $addToSet-modifier niet toepassen op niet-array

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

Het lijkt erop dat u een object aan een set probeert toe te voegen. Je krijgt een foutmelding bij de simulatie. Laten we die fout onderzoeken. De code die fouten maakt:

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 { ...

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

Kijk naar je code:

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

items is een object, geen array! Er zal een fout optreden.

Kun je $addToSet naar een object met Mongo? Laten we naar de code kijken.

https://github.com/mongodb/6mongo9b1d6dc79d1ba4a7d7eaa9e4eb6d00aa466c/db/update.cpp">https://github.com/mongodb/4mongo9b1/4a6mongo/blobda66 /db/update.cpp

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

Nee! Dit is van de oude Mongo-code, omdat de hedendaagse codebasis uitgestrekt is, maar hetzelfde.

Ik heb maar één insert gevonden in uw 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);
    }
  }
},

Probeer lists.insert({Category:catVal,items:[]}) . Zodat items worden geïnitialiseerd als een array in plaats van een object toen het voor het eerst werd gebruikt.

Ik denk ook niet dat $addToSet vergelijkt objecten in een array zoals u dat toch zou willen, dus overweeg om een ​​aparte verzameling Items te maken die een categoryId . bevat .

Het is puur toeval dat het op de ene plek werkt en niet op de andere.



  1. hoe geoNear in nodejs te gebruiken?

  2. Het scrapy-redis-programma sluit niet automatisch

  3. Vragen met Redis?

  4. Ingesloten documenten filteren in MongoDB