sql >> データベース >  >> NoSQL >> MongoDB

Meteor-MongoDBエラー:$addToSet修飾子を非配列に適用できません

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

    セットにオブジェクトを追加しようとしているようです。シミュレーションでエラーが発生します。そのエラーを調べてみましょう。エラーが発生するコード:

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

    ええと、 throw Error( "Cannot apply $ addToSet修飾子を非配列に適用できます。")

    コードを見てください:

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

    アイテム はオブジェクトであり、配列ではありません!エラーが発生します。

    $ addToSetできますか モンゴのオブジェクトに?コードを見てみましょう。

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

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

    いいえ!現代のコードベースは広大であるため、これは古いMongoコードからのものですが、同じことです。

    insertが1つだけ見つかりました コード内。

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

    lists.insert({Category:catVal、items:[]})をお試しください 。アイテムが最初に使用されたときにオブジェクトではなく配列として初期化されるようにします。

    また、 $ addToSetはないと思います とにかく希望する方法で配列内のオブジェクトを比較するので、別のコレクション Itemsを作成することを検討してください categoryIdを含む 。

    ある場所で機能していて、別の場所では機能していないのは、まったくの偶然です。



    1. DjangoCeleryはタスク内のpostgresdbをクエリできません

    2. 127.0.0.1:6379へのRedis接続に失敗しました-ECONNREFUSEDに接続します

    3. Mongodbはネストされたドキュメントをほどきます

    4. サーバーのMongoDBにJavaでリモート接続するにはどうすればよいですか?