Meteor.js& Collection2:在子模式中插入新对象的更新方法

时间:2015-12-15 20:52:03

标签: javascript mongodb meteor

CONTEXT

我有一个收藏品(“场地”)。我试图允许用户将新对象(“房间” - 定义为子模式)添加到场地对象的实例。每个房间都应该有一个唯一的ID(在collection2架构中使用autovalue)。

问题/我做了什么

我尝试了两种方法:

  1. Venues.insert - 尝试创建新的整个Venue实例,而不是向roomPricing子架构添加新行。
  2. Venues.update - 使用'$ set:params'抛出一个Exception while invoking method 'addRoom' MongoError: Cannot update 'roomPricing' and 'roomPricing.roomId' at the same time。如果我从集合中删除了Id,应用程序会更新“现有”房间值而不是创建一个“新”房间实例
  3. 总之,我需要一种方法来更新“父”对象(场地),同时在“房间”子模式中创建一个新的“子”对象。

    集合

    Schema.RoomPricing = new SimpleSchema({
        roomId: {
            type: String,
            autoValue: function(){
                 return Random.id();
                },
            optional: true
        },
        roomName: {
            type: String,
            max:50,
            optional: true
          }
        }
    
    // MAIN SCHEMA for the Venues colleciton. 
    Schema.Venues = new SimpleSchema({
        venueName: {
            type: String,
            label: "Venue Name",
            max: 200,
            optional: false
    },
       roomPricing: {
            type: Schema.RoomPricing,
            optional: true
      }
    }
    

    CONTROLLER&方法

      var currentVenueId = this.params._id
      var params = {
          roomPricing: {
              roomName: roomName,
              sitCapacity: sitCapacity,
            }
          }
    
      Meteor.call('addRoom', currentVenueId, params);
    
    //Method
    Meteor.methods({
      'addRoom': function (id, params) {
        Venues.insert({
            _id: id
            },{
            $set:params});
            }
        });
    

1 个答案:

答案 0 :(得分:1)

最后这是我使用的 - 需要$ push而不是$ set。

'addRoom': function (id, params) {
Venues.update({
     _id: id
   },{
     $push:params});
   }