2015-01-22 2 views
1

Я создаю свой первый проект с помощью Node.js, Express.js и Mongoose. У меня есть пользователь, со списком объектов акций [{symbol: amount}]. Когда пользователь хочет купить акции, они отправляют запрос POST с запасом, суммой и глаголом в этом случае «покупать». В Почте я беру запас и сумму из органа запроса и добавляю его в список акций Пользователя.Почему Mongoose заменяет пару ключ/значение в объекте с _id?

Запрос с

{stock: 'F', amount: '2', verb: 'buy'} 

следует добавить

{'F': '2'} 

к акции пользователя. Проблема заключается в том, когда я создаю и нажать на шток с

stockObject[stock] = amount; 
user.stocks.push(stockObject); 

user.stocks становится [{ _id: 54be8739dd63f94c0e000004 }] вместо [{'F': '2'}], но когда я делаю

stockObject={'symbol':stock, 'amount': amount} 

и толкать, что я буду получать

[{'symbol': 'F', 'amount': '2', _id: 54be8739dd63f94c0e000004}] 

Почему будет Mongoose заменить мои данные в первом случае, но сохранить его во втором?

var UserSchema = new Schema({ 
    id: String, 
    stocks: [{ 
     symbol: String, 
     amount: Number 
    }] 
}); 

router.route('/user/:user_id/action') 
    .post(function(req, res) { 
     User.findOne({ 
      id: req.params.user_id 
     }, function(err, user) { 
      if (err) res.send(err); 
      var stock = req.body.stock; 
      var amount = req.body.amount; 
      var stockObject = {}; 
      if (req.body.verb === 'buy') { 
       stockObject[stock] = amount; 
      } 
      user.stocks.push(stockObject); 
      user.save(function(err) { 
       res.json({ 
        stocks: user.stocks 
       }); 
      }); 

     }); 
    }) 

ответ

3

Вопрос заключается в том, что первый объект вы пытаетесь сохранить:

console.log(stockObject); 
// { 'F': '2' } 

ли не совпадает с Schema вы определили для него:

{ 
    symbol: String, 
    amount: Number 
} 

Mongoose Нормализует объекты, которые он сохраняет на основе Schema, удаляя избыточные свойства, такие как 'F', когда он ожидает только 'symbol' и 'amount'.

if(req.body.verb === 'buy') { 
    stockObject.symbol = stock; 
    stockObject.amount = amount; 
} 

Чтобы получить результат, как [{"F": "2"}], вы можете .map() сбор перед его отправкой клиенту:

res.json({ 
    stocks: user.stocks.map(function (stock) { 
     // in ES6 
     // return { [stock.symbol]: stock.amount }; 

     var out = {}; 
     out[stock.symbol] = stock.amount; 
     return out; 
    }); 
}); 

Или используйте Mixed типа, как указано в "How do you use Mongoose without defining a schema?" что позволит вам хранить { 'F': '2' }.

var UserSchema = new Schema({ 
    id: String, 
    stocks: [{ 
     type: Schema.Types.Mixed 
    }] 
}); 
+0

А, это имеет смысл. Итак, есть способ указать пару «ключ/значение» в схеме, или я должен отслеживать каждый запас по отдельности своим mongoose _id, а не пытаться делать user.stocks [stockSymbol]? – EasilyBaffled

Смежные вопросы