1
votes

Mongoose incapable d'obtenir des données de la base de données MongoDB

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.


0 commentaires

4 Réponses :


0
votes

.find () renvoie un tableau, pas un seul élément. Par conséquent, je recommande d'utiliser la méthode .findOne () à la place.


4 commentaires

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.



2
votes

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)}


0 commentaires

-1
votes
//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
})

0 commentaires

0
votes

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é.


0 commentaires