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" } ]
3 Réponses :
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) })
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.
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 champcreatedAt
.
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
.
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 ()
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);
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 variablevoice
vous transmettez àproducts.findOne
J'ai la solution ... MERCI