sql >> Databáze >  >> NoSQL >> MongoDB

Meteor – chyba MongoDB:Nelze použít modifikátor $addToSet na non-array

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

Zdá se, že se pokoušíte přidat objekt do sady. V simulaci se zobrazuje chyba. Pojďme tuto chybu prozkoumat. Chybný kód:

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

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

Podívejte se na svůj kód:

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

items je objekt, ne pole! Dojde k chybě.

Můžete $addToSet k objektu s Mongo? Podívejme se na kód.

https://github.com/bloeb6df94ba466 /db/update.cpp

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

Ani náhodou! Toto je ze starého Mongo kódu, protože současná kódová základna je rozlehlá, ale to samé.

Našel jsem pouze jeden insert ve vašem kódu.

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

Zkuste lists.insert({Category:catVal,items:[]}) . Takže položky jsou při prvním použití inicializovány jako pole, nikoli jako objekt.

Také si nemyslím, že $addToSet porovnává objekty v poli tak, jak byste chtěli, takže zvažte vytvoření samostatné kolekce Items který obsahuje categoryId .

Je čistě náhoda, že na jednom místě funguje a na jiném ne.



  1. Třídění na více polích mongo DB

  2. Mapujte „pole objektů“ na jednoduché pole klíčových hodnot

  3. Mongoose &Express:Jak správně odstranit, vytvořit a uložit data, která jsou referenční

  4. mongodb c# vyberte konkrétní pole