1

meteor アプリケーションにタスク コレクションがあります。タスクを「todo」から「doing」、「done」にプッシュしたいstatuses

私はそれらをDOMのIDを持つリストに入れました

メソッドと呼ばれる Task を更新する meteor メソッドを作成しましたが、機能しませんでした。何も起こりませんでした。タスクは更新されません。

というわけで、直接 Task.update メソッドを呼んでみました

 Meteor.methods({
    create : function(json){Task.insert(json);},
    update : function(id, conditions){Task.update(id, {$set : conditions});}
  });

Template.todo.events({
    'click .submit' : function(){
      console.log("event called",this._id);
      //Meteor.call('update',(this._id, {'status':'doing'}));
      Task.update(this._id, {'status':'doing'});
    }
  });

When Task.update(this._id, {'status':'doing'});

と呼ばれます。コレクションの説明フィールドが空になり、ステータス フィールドのみが更新されます。

Task.update の前

{ "_id" : "er6Rqvdj8P373cPM5", "status" : "doing" , "description" : "work out and eat green chillies"}

Task.update("er6Rqvdj8P373cPM5",{"status":"done"})

{ "_id" : "er6Rqvdj8P373cPM5", "status" : "done" }

通話中update : function(id, conditions){Task.update(id, {$set : conditions});}

流星ログに次のエラーが表示されます

メソッド 'update' の呼び出し中に例外が発生しました MongoError: 無効な修飾子が指定されました: $set

Exception while invoking method 'update' MongoError: Invalid modifier specified: $set
    at Object.Future.wait (/Users/otto/.meteor/tools/275efdf2db/lib/node_modules/fibers/future.js:322:15)
    at _Mongo.update (app/packages/mongo-livedata/mongo_driver.js:269:12)
    at _.each.Meteor.Collection.(anonymous function) [as update] (app/packages/mongo-livedata/collection.js:354:32)
    at Meteor.methods.update (app/alacrity.js:39:45)
    at _.extend.protocol_handlers.method.exception (app/packages/livedata/livedata_server.js:593:30)
    at _.extend.withValue (app/packages/meteor/dynamics_nodejs.js:31:17)
    at app/packages/livedata/livedata_server.js:592:46
    at _.extend.withValue (app/packages/meteor/dynamics_nodejs.js:31:17)
    at _.extend.protocol_handlers.method (app/packages/livedata/livedata_server.js:591:37)
    at _.extend.processMessage.processNext (app/packages/livedata/livedata_server.js:484:43)
    - - - - -
    at Object.exports.toError (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/utils.js:108:11)
    at null.<anonymous> (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/collection.js:477:24)
    at g (events.js:192:14)
    at EventEmitter.emit (events.js:126:20)
    at Server.Base._callHandler (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/connection/base.js:130:25)
    at Server.connect.connectionPool.on.server._serverState (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/connection/server.js:517:20)
    at MongoReply.parseBody (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:127:5)
    at Server.connect.connectionPool.on.server._serverState (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/connection/server.js:476:22)
    at EventEmitter.emit (events.js:96:17)
    at _connect (/Users/otto/.meteor/packages/mongo-livedata/405d21f01568c045554ee5b99d2bea88a5249feb/.npm/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:175:13)

流星のドキュメントは言うが:

// mark my first message as "important"
Messages.update(myMessages[0]._id, {$set: {important: true}});

http://docs.meteor.com/#meteor_user

4

2 に答える 2

3

これまでにエラーを発見したと思いますが、同じ問題に直面している可能性のある他の人のためにこれを投稿しています。

この行には余分な括弧があります:

Meteor.call('update',(this._id, {'status':'doing'}));

次のようになります。

Meteor.call('update',this._id, {'status':'doing'});

このメッセージが表示された場合:

MongoError: Invalid modifier specified: $set

問題は、おそらく $set のすぐ隣にあるものです。上記の場合は「未定義」です。

今日私に起こりました:)

于 2013-06-21T12:48:27.000 に答える
1

このエラーを引き起こす可能性のある & を使用している修飾子によって異なります。

基本的に使用する場合:

Task.update(this._id, {'status':'doing'});

ドキュメントを次のように設定しthis._idます{status: 'doing'}

使用$setすると、指定されたフィールドのみが設定されます。

Task.update(this._id, { $set: {'status': 'doing'}});

また、メソッドを使用する必要はなく、クライアントで直接実行できます。mongodb docsで $set を使用する方法の詳細

于 2013-04-30T00:05:10.683 に答える