1

次のようなマングーススキーマがあり、更新して問題なくクエリを実行できます。

// Subscriber Schema
var Subscriber = new Schema({
    'user': ObjectId,
    'level': { type: String, enum: [ 'sub', 'poster', 'blocked' ] }, //blocked means users has opted out of list
    'dateAdded': { type: Date, default: Date.now }
});

// Group Schema
var Group = new Schema({
    'groupEmail': { type: String, lowercase: true, validate: [validatePresenceOf, 'an email is required'], index: { unique: true } },
    'groupOwner': ObjectId,
    'groupName': String,
    'twitterFeed': String,
    'subscribers': [Subscriber],
    'createdAt': { type: Date, default: Date.now }
});

グループ文書内の購読者を更新し、そのレベルを変更して、変更を保存しようとしています。次を使用して、グループをうまく見つけることができます。

Group.findOne({ _id: req.params.groupId }, function(err, g)

グループを作成したら、サブスクライバーを見つけて更新できるようにします。私が試してみると:

g.subscribers.update({ 'user': req.params.userId }, { level: newStatus });

私は得る:

TypeError: Object { user: 4fc53a71163006ed0f000002,
  level: 'sub',
  _id: 4fd8fa225904a5451c000006,
  dateAdded: Wed, 13 Jun 2012 20:37:54 GMT },{ user: 4fda25ac00cd9bdc4f000004,
  level: 'sub',
  _id: 4fda270bbce9f8d058000005,
  dateAdded: Thu, 14 Jun 2012 18:01:47 GMT },{ user: 4fda2a634499dfd16e00000d,
  level: 'sub',
  _id: 4fda2a634499dfd16e00000e,
  dateAdded: Thu, 14 Jun 2012 18:16:03 GMT } has no method 'update'

更新、検索などのさまざまな順列を試しましたが、常に「メソッドがありません」というエラーが発生します。私は何を間違っていますか?Subscriber.level を更新する別の方法はありますか?

ありがとう!!

4

2 に答える 2

2

@eltoro はほとんど正しいです。配列にはメソッドがありません。update使用する提案Group.updateは適切ですが、更新構文に$inがありませんsubscribers.$.level

Group.update(
    {_id: req.params.groupId, 'subscribers.user': req.params.userId}, 
    { 'subscribers.$.level': newStatus }, function(err, result) {}
);
于 2012-06-15T20:18:04.043 に答える
0

モデルではなくインスタンスで更新を呼び出しているため、エラーが発生していると思います。

たぶん、次のようなことを試してください:

Group.update(
    {_id: req.params.groupId, subscribers.user: req.params.userId}, 
    { subscribers.level: newStatus }, function(err, result) {}
);
于 2012-06-14T21:13:01.310 に答える