Meteor Autoform, ловушки для коллекций - Как вставить в массив профиля пользователя после вставки в коллекцию?

Я пытаюсь вставить в массив профиля пользователя после вставки автоформ в другую коллекцию (Meteor.users).

Мой простой массив схем настроен так - (в схеме профиля)

listings: {
type: [String],
optional: true
},
"listings.$.id": {
type: String,
optional: true
}

И это мой метод ловушки коллекции, который должен быть вставлен после перечисления вставки.

//Add listing to user collection on submit
Listings.after.insert(function(userId, doc) {
console.log("STUFF");
Meteor.users.update({_id : userId},
{
    $push :
    {
        'profile.listings.$.id' : this._id 
    }
}

На мой взгляд, это должно работать. Форма вставляется корректно без хука, но теперь, когда я отправляю форму, я получаю эту ошибку в консоли JS:

Ошибка: после фильтрации ключей, не входящих в схему, ваш модификатор теперь пуст (…)

Запускается console.log("stuff"), я вижу это в консоли до ошибки.

У кого-нибудь есть идеи, как это сделать?

РЕДАКТИРОВАТЬ - исправлено несколько вещей, переключив его на:

Listings.after.insert(function(userId, doc) {
console.log("STUFF" + userId + '     ' + this._id);
Meteor.users.update({_id: userId },
{
    $set :
    {
        "profile.listings.$.id" : this._id 
    }
}

)});

Теперь я не могу вставить в массив из-за оператора $.

1 ответ

Решение

Предполагая, что списки - это просто массив объектов с id поле, вы могли бы сделать:

listings: {
  type: [Object],
  optional: true
},
"listings.$.id": {
  type: String,
  optional: true
}

Listings.after.insert(function(userId, doc) {
  var id = this._id;
  Meteor.users.update({_id: userId }, {
    $push : {
        "profile.listings" : { id: id }
    }
  }); 
});

Это изменит ваши списки с массива строк на массив объектов - вы не можете иметь свойство id на струне. Это тогда позволяет вам делать $ push для массива profile.listings с рассматриваемым объектом. Если вы буквально просто храните идентификатор в списках, вы можете упростить это еще больше:

listings: {
  type: [String],
  optional: true
}

Listings.after.insert(function(userId, doc) {
  var id = this._id;
  Meteor.users.update({_id: userId }, {
    $push : {
        "profile.listings" : id
    }
  }); 
});

Может быть, вы пропускаете некоторый код, но с вашей текущей схемой вам ничего не нужно, кроме массива строк - не нужно свойство id.

Другие вопросы по тегам