2014-11-27 4 views
1

У меня есть следующая схема:Вставить в внедренный документ

var UserSchema = new Schema({ 
    username: { type: String, required: true }, 
    password: { type: String, required: true }, 
    userType: { type: String, default: 'user'}, 
    quizzHistory: [{ 
    quizzName: String, 
    quizzScore: Number 
    }] 
}); 

моя цель состоит в том, чтобы изменить документ на встроенный quizzHistory или вставить новый, если не существует документ в встроенном quizzeHistory

Я пытаюсь установить документ в встроенный quizzHistory:

User.findOneAndUpdate({ _id: req.session.user['_id'], 'quizzHistory.quizzName': testName}, 
{ 
    '$set': { 
     'quizzHistory.$.quizzName': testName, 
     'quizzHistory.$.quizzScore': finalScore 
    } 
}, {upsert: true}, 
function(err, upd) { 
    console.log("added"); 
}) 

выше код работает, если есть документ в quizzHistory с требуемым _id и quizzHistory.quizzName, но не нажат новый, если я любой документ.

Есть ли какой-либо способ в Mongodb изменить документ во встроенную коллекцию или вставить новый, если он не существует?

ответ

1

это работало для меня

User.update({ _id: req.session.user['_id'],'quizzHistory.quizzName':testName}, 
{ 
    $set: { 
     "quizzHistory.$.quizzName":testName, 
     "quizzHistory.$.quizzScore":finalScore 
    } 
}, 
function(err, upd) { 
    if(!upd){ 
     User.update({ _id: req.session.user['_id']}, 
     { "$addToSet": { quizzHistory: newScoreData }},function(err,data){ 
     }); 
    } 
}); 
2

Причина в том, что вы используете «найти и обновить», что не выполняете условие, когда строка не найдена и не создайте новый документ, заявив, что вам нужно управлять другим способом, например

User.update({ _id: req.session.user['_id'], 'quizzHistory.quizzName': testName}, 
{ 
    '$push': { 
     'quizzHistory.quizzName': testName, 
     'quizzHistory.quizzScore': finalScore 
    } 
}, {upsert: true}, 
function(err, upd) { 
    console.log("added"); 
}) 
+0

hi @ jack.the.ripper спасибо за ваш ответ, нет способа сделать это без каких-либо условий? – kaxi1993

+0

который состояние? можете ли вы немного подробнее остановиться? –

+1

Я буду делать user.find, и если он вернет пустой массив, я использую $ push иначе $ set – kaxi1993

1

Если вы хотите воспользоваться для всех возможных плагинов и методов добавлены модели и не хотят бороться с фактической Монго запросов вы должны сначала получить объект пользователя, а затем нажмите новый элемент для массива quizzHistory и сохранить. Что-то вроде ниже (вам нужно привести этот код в соответствие с вашими потребностями).

var entry = { 
    quizzName : 'abc', 
    quizzScore : 123 
}; 

User.findOne({_id:id, function(err, object) { 
    if(err) { 
    return someErrorCallback(); 
    } 
    var 
    object.quizzHistory.push(entry); 
    object.save(function(err) { 
    if(err) { 
     return someErrorCallback(); 
    } 
    someSuccessCallback(); 
    }); 
}); 

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

Надеюсь, это имеет смысл.

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