2015-09-23 2 views
1

У меня есть следующие 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

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

+0

Если вы хранение _id для каждого пользователя, а не объект, нужно настроить схему, чтобы быть 'тип: [String]' – challett

+0

Когда AutoForm сохраняет такой документ Идентификатор в виде строки, но схема по-прежнему является User.Schema – znat

+0

Вот почему она не обновляется. Он пытается сохранить строку, в которой схема ожидает объект. – challett

ответ

1

Если вы просто хотите сохранить массив 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() }}); 
+0

как $ addToSet лучше, поскольку он только добавляет значение, если оно еще не присутствует. Кажется более уместным в этом случае, когда члены команды должны быть набором уникальных userIds – MrE

+0

Да, конечно, хороший звонок, ответ обновляется. –

+0

Спасибо, я понимаю, но что-то еще меня озадачивает: если я делаю то же самое с Autoform (скажем, с быстрой формой в шаблоне с текстовым вводом, в который я вставляю идентификатор), он работает. – znat

0

Ниже вероятно синтаксис вы после этого, если вы также используете 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]; 
     } 
    } 
    } 
}); 
Смежные вопросы