2014-09-23 1 views
0

Мое определение схемы, как показано ниже. UserSchema имеет встроенные карты, которые в свою очередь, имеет много сделок ..Подгрузочный файл обновления Mongoose подкаталога

var TransactionSchema = new Schema({ 
    merchantName: String, 
    transactionTime: Date, 
    latitude: Number, 
    longitude: Number, 
    amount: Number 
}); 

var CardSchema = new Schema({ 
    cardIssuer: String, 
    lastFour: String, 
    expirationDate: String, 
    transactions : [TransactionSchema] 
}); 

/* 
* ...User Schema... 
*/ 
var UserSchema = new Schema({ 
    name: String, 
    email: { type: String, lowercase: true }, 
    role: { 
    type: String, 
    default: 'user' 
    }, 
    hashedPassword: String, 
    provider: String, 
    salt: String, 
    imageURL: String, 
    phoneNumber: String, 
    card: [CardSchema] 
}); 

Я хочу, чтобы добавить транзакцию на карту уже в userschema, но я не знаю, как это сделать в мангуста/MongoDB

I идентифицировать пользователь и карту следующим образом ..

вызова апи проходит через Идент промежуточного слой первого

function isAuthenticated() { 
    return compose() 
    // Validate jwt 
    .use(function(req, res, next) { 
     // allow access_token to be passed through query parameter as well 
     if(req.query && req.query.hasOwnProperty('access_token')) { 
     req.headers.authorization = 'Bearer ' + req.query.access_token; 
     } 
     validateJwt(req, res, next); 
    }) 
    // Attach user to request 
    .use(function(req, res, next) { 
     User.findById(req.user._id, function (err, user) { 
     if (err) return next(err); 
     if (!user) return res.send(401); 

     req.user = user; 
     next(); 
     }); 
    }); 
} 


// This is update based on Neil's answer below... 
exports.create = function(req, res) { 
    //var userItem = req.user; 
    //console.log(userItem._id); 
    //console.log(req.params.card); 
    Transaction.create(req.body, function(err, transaction){ 
    console.log(transaction); 
      //id = mongoose.Types.ObjectId; 

      User.findOneAndUpdate({"card._id":id(req.params.card)},{ 
      // $set : { 
      // role: 'user1' 
      // } ---- this update operation works!! 
       "$push": { 
        "card.$.transactions": transaction 
       } // -- this update operation causes error ... 
      }, function(err,user) { 
      // updated document here 
      console.log('err' + err + " user " + user) ; 
      return res.json(200, user); 
     } 
    ) 
    // } 
    // }) 
}) 
}; 

ответ

2

Добавление новых элементов к внутреннему массиву не diffic ult, поскольку все, что вам действительно нужно сделать, - это соответствие позиции внешнего массива для обновления в вашем запросе, а затем применить оператор positional $ в части обновления.

var transaction; // and initialize as a new transaction 

User.findOneAndUpdate(
    { "card._id": cardId }, 
    { 
     "$push": { 
      "card.$.transactions": transaction.toObject() 
     } 
    }, 
    function(err,user) { 
     // updated document here 
    } 
) 

Так что просто для $push операций. Но будьте осторожны, если вы только захотите $push или $pull, так как попытка обновления в позиции «внутреннего» массива невозможна, так как оператор позиционирования будет содержать только совпадение или позицию во внешнем массиве ,

+0

Я не уверен, но получаю RangeError: Максимальный размер стека вызовов превышен, когда я пытаюсь выполнить приведенный выше код. – rOrlig

+0

@gaurav Похоже, вы что-то делаете внутри цикла. Не уверен, что вы делаете, не отправляя код. –

+0

hi neil, я ничего не делаю в цикле. Мне пришлось изменить ваш ответ на поиск ObjectId(), но я все равно получаю ту же ошибку. Если я не выполняю операцию push, я не получаю ошибку. – rOrlig

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

  • Нет связанных вопросов^_^