J'ai un modèle (AccountModel.js) comme ci-dessous et le contrôleur correspondant. J'ai essayé de changer un document en utilisant le facteur mais j'obtiens un tableau vide de l'événement de base de données bien que les données soient présentes.
{ account_id: 5c18fbaac5a6a4ebf7999c07 } '...' [] 'setWelcomeMessage'
et AccountController comme ci-dessous pour gérer le compte db. J'ai consolidé la requête et la sortie de la base de données.
{ "acnt_id":"5c18fbaac5a6a4ebf7999c07", "welcomeMessage":"test message 3!!" }
ci-dessous est la base de données
> db.account.find().pretty() { "_id" : ObjectId("5c18fea5c5a6a4ebf7999c0b"), "account_id" : ObjectId("5c18fbefc5a6a4ebf7999c08"), "account_key" : "UDS1500", "message" : "testing message", "created_at" : ISODate("2018-12-18T14:05:25.637Z"), "updated_at" : ISODate("2018-12-18T14:05:25.637Z") } { "_id" : ObjectId("5c18feffc5a6a4ebf7999c0c"), "account_id" : ObjectId("5c18fbaac5a6a4ebf7999c07"), "account_key" : "UDS1299", "message" : "testing message2", "created_at" : ISODate("2018-12-18T14:06:55.968Z"), "updated_at" : ISODate("2018-12-18T14:06:55.968Z") }
après avoir appelé de POSTMAN Je reçois un tableau vide
Voici le format de la requête
var mongoose = require('mongoose') var Account = require('../models/AccountModel') var ObjectId = mongoose.Types.ObjectId; exports.setMessage = function(req,res){ query = {account_id:new ObjectId(req.body.acnt_id)} console.log(query,"...") Account.find(query,function(err,account_data){ if(err){ res.send(err) } else{ try{ console.log(account_data,'setWelcomeMessage') account_data.message = req.body.welcomeMessage account_data.updated_at = new Date() account_data.save((err,data)=>{ if(err){ console.log(err) res.send(err) } res.send({"Status":"Success"}) }) res.send({"Status":"Success"}) } catch(e){ //console.log(e) res.send({"Status":"Failed"}) } } }) }
La console est comme ci-dessous
let mongoose = require('mongoose') let Schema = mongoose.Schema var ObjectId = Schema.ObjectId let mySchema = mongoose.Schema({ account_id:ObjectId, account_key:String, message:String, created_at:Date, updated_at:Date }) let MySchema = module.exports = mongoose.model('account',mySchema); module.exports.get = function(callback,limit){ MySchema.find(callback).limit(limit) }
quel pourrait être le problème pour obtenir des données vides? j'ai perdu beaucoup de temps là-dessus.
4 Réponses :
.find () renvoie un tableau, pas un seul élément. Par conséquent, je recommande d'utiliser la méthode .findOne () à la place.
je reçois une valeur nulle même après la mise à jour avec findOne
Ok, avez-vous essayé de ne PAS convertir req.body.acnt_id
en ObjectId? La mangouste devrait être capable de le faire seule. En outre, est-ce que acnt_id est destiné à référencer un autre objet ou voulez-vous réellement stocker "uniquement" l'ObjectId?
J'ai essayé avec le casting aussi comme indiqué ci-dessous. Il montre toujours la même chose. {account_id: nouvel ObjectId (req.body.acnt_id)}
Je voulais en fait ne PAS utiliser le nouvel ObjectId () comme Chridam l'a correctement indiqué, que cela pose des problèmes.
Le coupable est cette ligne
let mySchema = mongoose.Schema({ account_id: ObjectId, account_key: String, message: String, }, { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } });
où l'instruction new ObjectId (req.body.acnt_id)
crée un nouvel identifiant (indépendamment de ce que vous passez dans le constructeur) ainsi votre requête échoue car il n'y aura aucune correspondance dans la base de données. Vous n'avez pas nécessairement besoin de convertir la chaîne acnt_id
en ObjectId
car Mongoose le fait pour vous sous le capot, mais si nécessaire, utilisez
exports.setMessage = (req, res) => { const query = { 'account_id': req.body.acnt_id }; const update = { '$set': { 'message': req.body.welcomeMessage, 'updated_at': new Date(), } }; const options = { 'new': true }; Account.findOneAndUpdate(query, update, options, (err, account_data) => { if (err){ res.send(err) } else { console.log(account_data); // logs the updated account document res.send({"Status":"Success"}) } }); }
sinon
query = {account_id:req.body.acnt_id}
suffira.
Une meilleure façon de faire la mise à jour serait d'utiliser le findOneAndUpdate
qui effectue une mise à jour atomique de votre modèle et principalement utilisé lorsque vous souhaitez mettre à jour un seul document dans la base de données et le renvoyer à votre application, afin que vous puissiez refactoriser votre méthode de contrôleur en:
query = {account_id:mongoose.Types.ObjectId(req.body.acnt_id)}
Vous pouvez également définir horodatages dans votre schéma où mangouste attribue createdAt
et updatedAt
les champs de votre schéma et le type attribué est Date
ie
query = {account_id:new ObjectId(req.body.acnt_id)}
//getting from postman .... give the account id in postman query = {account_id:req.body.acnt_id}; //there is match in DB--- getting the data Account.find(query,function(err,account_data){ if(err){ res.send(err) } u wana update else{ Accoun.update({account_id:req.body.acnt_id},req.body }; //on body what you enter in postman that will update and store on DB IN MY KNOWLEDGE // just example Model.update Updates all documents matching conditions using the update clause. All update values are casted to their appropriate types before being sent. var conditions = { name: 'bourne' } , update = { $inc: { visits: 1 }} , options = { multi: true }; Model.update(conditions, update, options, callback); function callback (err, numAffected) { // numAffected is the number of updated documents })
Merci pour votre réponse. J'ai trouvé une réponse à mon problème.
La raison est que la mangouste a créé un modèle avec le nom pluriel. Ce qui signifie, ici, j'ai nommé le modèle "compte". Mais ici, dans la base de données, il créera / se connectera à une collection avec le nom "comptes". Je ne connais pas la raison pour laquelle mangouste ne crée pas / ne se connecte pas à une collection nommée "comptes". Puisqu'il n'y a pas de collection nommée avec "comptes", cela me donne toujours le résultat vide.
Enfin, j'ai changé le nom de la collection en "comptes". Maintenant, ça marche bien.
Veuillez commenter la raison, mangouste de créer / de se connecter au pluriel du modèle donné.