2016-10-12 3 views
0

Я хочу создать поддокумент в подобъекте, а не обновлять.Mongoose создать подобъект в подобъекте

Моя схема:

var DemandeSchema = new Schema({ 
    titre: { 
     type: String, 
     required: true 
    }, 
    description: { 
     type: String, 
     required: true 
    }, 
    type: { 
     type: String, 
     required: true 
    }, 
    answer: {} 
}); 

Мой код:

demande.update(
    { name: 'answer' }, 
    { $push: req.body.answer }, 
    { upsert: true }, 
    function(error, user) { 
     if (error) return next(error); 
     else { 
      return true; 
     } 
    } 
) 

req.body.answer = { 
    "id": "57f512f4360d8818a4e5ea3d", 
    "answer": { 
    "122547eee99" : { 
     "review" : "1.3", 
     "login" : "new" 
    } 
    } 
} 

Но этот код не создает новое поле в моей БД, он просто обновляет поле answer, когда я просто хочу создать новое поле объекта в поле ответа.

Фактический результат:

{ 
    "_id" : ObjectId("57f512f4360d8818a4e5ea3d"), 
    "titre" : "TEST", 
    "description" : "ee", 
    "type" : "ee", 
    "__v" : 0, 
    "answer" : { 
     "122547eee98" : { 
      "review" : "8.8", 
      "login" : "x" 
     } 
    } 
} 

Ожидаемый результат:

{ 
    "_id" : ObjectId("57f512f4360d8818a4e5ea3d"), 
    "titre" : "TEST", 
    "description" : "ee", 
    "type" : "ee", 
    "__v" : 0, 
    "answer" : { 
     "122547eee98" : { 
      "review" : "8.8", 
      "login" : "x" 
     }, 
     "122547eee99" : { 
      "review" : "1.3", 
      "login" : "new" 
     } 
    } 
} 
+0

ответ поле должно быть массивом, поэтому его можно нажать на массив и добавить новую запись – chirag

ответ

1
var DemandeSchema = new Schema({ 
titre: { 
    type: String, 
    required: true 
}, 
description: { 
    type: String, 
    required: true 
}, 
type: { 
    type: String, 
    required: true 
}, 
answer: [] 
}); 

ответ поле фигурных скобки будут конвертировать в квадратные скобки для толкания всех новых ответов. Заключение: он создает массив.

0

Попробуйте это, и в схеме ответа: [],

demande.findOne({ name: 'answer' }, function(err, result){ 
result.answer.push({ans:req.body.answer}) 
var dem = new Demande(result); // Demande is ur mongoose schema model, 
dem.save(function(err, result){ 

console.log(result); 
}); 
}) 
1

Вместо оператора $push, который работает на массивах, используйте оператор в $set вместе с точечной нотации к set the subdocument in the embedded answer document.

Вам необходимо будет предварительно обработать документ, который будет использоваться в вашем обновлении, чтобы он имел dot notation. В следующем примере Монго оболочки демонстрирует это:

var obj = { 
     "id": "57f512f4360d8818a4e5ea3d", 
     "answer": { 
      "122547eee99" : { 
       "review" : "1.3", 
       "login" : "new" 
      } 
     } 
    }, 
    update = {}; 
var key = Object.keys(obj.answer)[0]; // get the dynamic key "122547eee99" 
update["answer."+key] = obj.answer[key]; // create the update object with dot notation 

/* 
    update = { 
     "answer.122547eee99": { 
      "review" : "1.3", 
      "login" : "new" 
     } 
    } 
*/ 

db.demandes.update(
    { "_id" : ObjectId(obj.id)}, 
    { "$set": update }, 
    { "upsert": true } 
) 

Используя ту же концепцию, что и выше, вы можете создавать документы для использования в обновлении следующим образом:

var update = {}, 
    key = Object.keys(req.body.answer.answer)[0]; // get the dynamic key "122547eee99" 

// create the update object with dot notation 
update["answer."+key] = req.body.answer.answer[key]; 

demande.update(
    { "_id": req.body.answer.id }, 
    { $set: update }, 
    { upsert: true }, 
    function(error, user) { 
     if (error) return next(error); 
     else { 
      return true; 
     } 
    } 
); 
Смежные вопросы