0
votes

Comment obtenir la valeur unique du dernier enregistrement en mangouste

J'ai essayé d'obtenir la dernière valeur d'enregistrement mais ne fonctionnait pas. Comment le faire chez la mangouste.

Exemples d'enregistrements de données dans mongodb:

var Order = mongoose.model(collectionName);
  Order.find({}).sort({ _id: -1 }).limit(1).then((products) => {
    
    products.findOne({voice}, function(err,obj) { 
    
      console.log(obj);//Output should be = Tested
    
    });
});

Requête Mongoose:

La valeur de voice propriété voice dans le dernier enregistrement est "Testé", j'ai donc essayé d'obtenir cette valeur.

[
    {
        _id: 5f0c73f69b34214310d0acee,
        name: "Test",
        age: 28,
        voice: "Not Tested"
    },
    {
        _id: 5f0c73f69b34214310d0akke,
        name: "Test2",
        age: 38,
        voice: "Tested"
    }
]


4 commentaires

Le nom du schéma y est absent. var Order = mongoose.model(collectionName,schema name);


@NithinKJoy :: nom de schéma n'est pas un problème..J'ai configuré


Salut @Makizh, quelle est la valeur de obj votre code enregistre actuellement et pouvez-vous partager la valeur de la variable voice vous transmettez à products.findOne


J'ai la solution ... MERCI


3 Réponses :


2
votes

Finalement, après avoir essayé pendant 3 heures, j'ai trouvé la réponse.

    User.find({}).sort({_id: -1}).limit(1).then((products) => {
        console.log(products[0].voice)
    })


9 commentaires

Je veux obtenir la valeur de la voix. La valeur de la voix Bcoz sera modifiée


Je pense que maintenant tu peux comprendre ce que j'attends


D'après ce que j'ai compris, vous vous attendez à la valeur vocale du dernier enregistrement. Il peut être testé ou non testé?


Non "Testé" et "Non testé" uniquement .. la valeur de la voix sera modifiée comme la voix: toute valeur


Vous avez une idée?


Je travaille dessus. Je reçois _id avec la voix. Je publierai une réponse après l'avoir reçue.


Vous avez une solution?


J'ai la solution


J'ai la réponse, essayez juste. Je pense que je suis en retard.



0
votes

Parce que tu le fais mal. En fait, si vous n'aviez pas besoin d'insérer pour la dernière fois dans un document de collection, mais pour la dernière mise à jour, vous devez utiliser des timestamps dans votre schéma ( mongoose docs )

Donc, votre schéma de collection devrait ressembler à ceci:

t.voice = new_value
t.save()

Ainsi, vous n'aurez pas seulement field_one et field_two , mais aussi des champs spéciaux comme createdAt et updatedAt

Ensuite, n'oubliez pas d'ajouter un index pour les performances à votre schéma sur le champ updatedAt , comme ceci:

async function LastUpdatedVoice () {
   try {
       let t = await model.findOne({ "field_one": "value" }).select('voice').lean().sort({updatedAt: -1});
       console.log(t);
   } catch (e) {
       console.error(e)
   }
}

et seuls eux utilisent:

schema.index({ updatedAt: -1 },{name: 'IndexName'});

Pour le dernier document inséré, le code sera le même, mais au lieu du champ updatedAt , vous devez utiliser le champ createdAt .

Aussi, encore une chose:

* Si vous avez besoin de mettre à jour ce document juste après qu'il a été trouvé, vous pouvez le faire sans utiliser l'option lean() dans ma requête. Et mis à jour le Mongoose Doc lui-même, via:

let schema = new mongoose.Schema({
    field_one: Number,
    field_two: String,
},{
    timestamps: true
});

mais je vous recommande fortement d'utiliser la méthode findOneAndUpdate .


2 commentaires

Ne fonctionne pas: products.findOne ({"field_one": "value"}). Select ('voice'). Lean (). Sort ({updatedAt: -1})


Il ne devrait pas, remplacez simplement "field_one": "value" par vos propres, field et value , puis appelez la fonction via LastUpdatedVoice ()



0
votes

Je l'ai trouvé plus simple de cette façon.

let docHandler = async () => {
   let lastDoc = (await Model.find({}).sort({_id: -1}).limit(1))[0];
   console.log(lastDoc);
};

Sinon, si vous l'utilisez dans une fonction, assurez-vous que la fonction est async .

let lastDoc = (await Model.find({}).sort({_id: -1}).limit(1))[0];
console.log(lastDoc);


0 commentaires