提问者:小点点

如何获取mongoose中最后一个记录的一个值


试图获取最后一个记录值1,但无法工作。 猫鼬怎么做。

MongoDB中的示例数据记录:

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

猫鼬查询:

最后一条记录中的voice属性的值被“测试”,因此我尝试获取该值。

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

共2个答案

匿名用户

因为你做错了。 实际上,如果不需要最后一次插入集合文档,而是需要最后一次更新,则应该在模式(猫鼬文档)中使用时间戳

所以您的集合模式应该是这样的:

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

因此,您将不仅具有field_onefield_two,而且还具有诸如createdatupdatedat之类的特殊字段

然后,不要忘了在updatedat字段中为您的模式添加性能索引,如下所示:

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

并且只有它们使用:

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

对于最后插入的文档,代码将是相同的,但您应该使用updatedat字段,而不是createdat字段。

还有,还有一点:

*如果您需要在找到该文档后立即更新该文档,您可以在我的查询中不使用lean()选项进行更新。 并更新了猫鼬文档本身,通过:

t.voice = new_value
t.save()

但我强烈建议您使用findoneAndUpdate方法。

匿名用户

最后,经过漫长的3个小时的尝试,我找到了答案。

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