【问题标题】:How to find documents如何查找文件
【发布时间】:2015-10-26 20:53:11
【问题描述】:

下面是app.js中的mongoose代码

app.get('/view', function (req, res) {


if (err) return handleError(err);

    {

); });

我有两个不同的主机条目,即 Host_name:Redhat1,Host_name:Redhat2。 如何使用 mongoose 仅​​获取两者的最新条目。 在上述模式中的查找条件中应该修改什么。请帮忙

【问题讨论】:

  • 需要更多描述
  • 你需要 Redhat1,Redhat2 的最新条目对吗?
  • Host_Name 查找(每个名称一个查询),按时间戳排序desc 并限制为1。
  • 你可以像@ShanShan 所说的那样做,但是还有另一种好方法是按 Host_name 按时间戳和限制 2 对结果进行分组
  • @AlokDeshwal 分组可能有意想不到的结果,排序时名字的两个最新条目可以在顶部。

标签: javascript node.js mongodb express mongoose


【解决方案1】:

试试这个

User.aggregate(
        { $match: { "Host.Host_name": { $in: ["RedHat1", "RedHat2"] }}}
        { $group: { _id: "$Host.Host_name", Time_stamp:{$last:'$Date.Time_stamp'}}}
       ,function (err,docs) {
        if (err) return handleError(err);
                var Users = docs.map(function (User){
                    return {
                        time: User.Time_stamp,
                        host: User._id
                    }
                });
            res.render('index',{Users: Users});
        });

希望这能解决您的问题

【讨论】:

  • 聚合有效,但不需要$limit,只需在$group 前添加$match。代码:pastebin.com/CQnPuBWP
  • 有一个错误,所以检查修改了一个,它工作了
  • @ShanShan 代码为您创建错误,我的代码对您有用吗?
  • @ShanShan 能否告诉我将回调作为参数传递和 .exec 命令有什么区别
  • @ShanShan 你在回答我的问题
【解决方案2】:

最简单的方法:按 Host_Name 查找(每个名称一个查询),按时间戳顺序 desc 并限制为 1。

// needed to tell mongoose to use ES6 Promises
require('mongoose').Promise = global.Promise;

app.get('/view', function (req, res) {
    var query1 = User.find({ "Host.Host_name": "RedHat1" })
        .sort({ Date.Time_stamp: -1 })
        .limit(1)
        .exec(); // exec() without argument returns a promise

    var query2 = User.find({ "Host.Host_name": "RedHat2" })
        .sort({ Date.Time_stamp: -1 })
        .limit(1)
        .exec();

    Promise.all([query1, query2])
        .then(function (docs) {
            var Users = docs.map(function (User){
                return {
                    time: User.Date.Time_stamp,
                    host: User.Host.Host_name
                }
            });
            res.render('index',{Users: Users});
        }).catch(function (err) {
            console.log(err);
        });
});

编辑:做两个查询会导致另一个问题,您必须等待两个都完成才能发送响应,所以我更新了我的示例。

【讨论】:

  • 更正了几个错别字。试试console.log(docs),我刚试过,它有效。 docs 是一个包含两个数组的数组,每个数组包含一个文档。
  • 不,这是标准的 ES6 承诺,它已经存在了一段时间。问题出在其他地方,您使用的是什么版本的猫鼬?也许它太旧了,它没有返回一个承诺(它似乎需要一个 exec 回调)。 Doc for exec() function.
  • 哎呀,4年前的版本了,如果可以的话,你应该考虑更新。
  • 但是你是怎么得到那个旧版本的?你是如何安装猫鼬的?在您的项目目录中运行npm install mongoose 将安装最新版本。
  • 在下面查看我对 Alok Deshwal 的回答的评论,我发布了一个应该可以工作的代码。
猜你喜欢
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2015-12-20
  • 2023-03-26
相关资源
最近更新 更多