метеор - Как добавить вложенный документ в качестве ссылки с помощью SimpleSchema

У меня есть следующая SimpleSchema

Schema.Team = new SimpleSchema({
    name:{
        type:String
    },
    members: {
        type: [Schema.User],
        optional:true
    }
});

Я хотел бы вставить (на сервер) новый командный документ с текущим пользователем в качестве ссылки (а не встроенного документа).

Я пытался:

Teams.insert({name:"theName",members:[Meteor.user()]}) // works but insert the user as an embedded doc.

Teams.insert({name:"theName",members:[Meteor.user()._id]}) // Error: 0 must be an object

Я также пробовал в два этапа:

var id = Teams.insert({name:teamName});
Teams.update({ _id: id },{ $push: { 'users': Meteor.user()._id } });

Тогда у меня другая ошибка, которую я не понимаю: Error: When the modifier option is true, validation object must have at least one operator

Итак, как я могу вставить документ со ссылкой на другую схему?


person znat    schedule 23.09.2015    source источник
comment
Если вы сохраняете _id для каждого пользователя вместо объекта, вам нужно настроить свою схему так, чтобы она была type: [String]   -  person challett    schedule 24.09.2015
comment
Когда автоформа сохраняет такой документ, идентификатор представляет собой строку, но схема по-прежнему является User.Schema.   -  person znat    schedule 24.09.2015
comment
Вот почему он не может обновиться. Он пытается сохранить строку, где схема ожидает объект.   -  person challett    schedule 24.09.2015


Ответы (2)


Если вы просто хотите сохранить массив userId в своей коллекции Team, попробуйте:

Schema.Team = new SimpleSchema({
    name:{
        type:String
    },
    members: {
        type: [String],
        optional:true
    }
});

затем

Teams.insert({ name: "theName", members: [Meteor.userId()] });

Должно сработать. Позже, когда вы захотите добавить дополнительный идентификатор, вы можете просто:

Teams.update({ _id: teamId },{ $addToSet: { members: Meteor.userId() }});
person Michel Floyd    schedule 24.09.2015
comment
как $addToSet лучше, так как он добавляет значение только в том случае, если оно еще не присутствует. Кажется более подходящим в этом случае, когда члены команды должны быть набором уникальных идентификаторов пользователей. - person MrE; 24.09.2015
comment
Спасибо, я понял, но что-то меня все же озадачивает: Если я делаю то же самое с Автоформой (скажем, с быстрой формой в шаблоне с текстовым вводом, в который я вставляю id) он работает. - person znat; 24.09.2015

Ниже приведен синтаксис, который вам нужен, если вы также используете AutoForm.

Если вы используете collection2, вы также можете добавить автоматическое значение при создании команды, чтобы автоматически добавить создателя в эту команду для большего удобства.

Schema.Team = new SimpleSchema({
  name: {
    type:String
  },
  members: {
    type: [String],
    defaultValue: [],
    allowedValues: function () {
      // only allow references to the user collection.
      return Meteor.users.find().map(function (doc) {
        return doc._id
      });
    },
    autoform: {
      // if using autoform, this will display their username as the option instead of their id.
      options: function () {
        return Meteor.users.find().map(function (doc) {
          return {
            value: doc._id,
            label: doc.username // or something
          }
        })
      }
    },
    autoValue: function () {
      if (this.isInsert && !this.isFromTrustedCode) {
        return [this.userId];
      }
    }
  }
});
person corvid    schedule 24.09.2015