最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Elasticsearch与MongoDB聚合

IT培训 admin 7浏览 0评论

Elasticsearch与MongoDB聚合

我正在将MongoDB查询转换为NodeJS平台中的Elasticsearch。在开发过程中,我像在MongoDB查询中一样,在Elasticsearch Query中处理grouping and filter数据(获取诸如hits.hits._source之类的嵌套对象)时遇到一些困难。

示例:-

UserModel.aggregate([
    {
        $match: {
            uId: req.body.uId, timestamp: { $gte: req.body.date, $lte: new Date() }
        },
    },
    {
        $group: {
            _id: "$eId",
            location: {
                $push: {
                    time: "$timestamp", lat: "$lat"
                }
            },
            timestamp: {
                $push: "$timestamp"
            },
            testId: { $first: "$testId" },
        }
    },
    {
        $project: {
            eId: 1, location: 1, testId: 1, max: { $max: "$timestamp" }
        }
    },
    { $unwind: { path: "$location", preserveNullAndEmptyArrays: true } },
    {
        $redact: {
            $cond: {
                if: { $eq: ["$location.time", "$max"] },
                then: "$$DESCEND",
                else: "$$PRUNE"
            }
        }
    },
    {
        $project: {
            eId: 1, latitude: "$location.lat", testId: 1
        }
    },
]).exec(function (err, result) {
    console.log(result)
});

Elasticsearch中的等效查询是什么?我正在寻找通过最小化嵌套响应对所需数据进行分组,展开和投影(从MongoDB概念到Elasticsearch)的解决方案。提前致谢。

编辑:-

添加Elasticsearch文档:-

{
          "timestamp": "2019-10-08T:02:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            2.000,
            34.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:02:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a408",
          "location": [
            2.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:03:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            4.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:03:40:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            2.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4e1"
},
{
          "timestamp": "2019-10-10T:03:40:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            3.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4e1"
}
  1. 状态为= 1,且按eId分组的比赛
  2. 具有该结果,按时间戳分组并获得最大时间戳值

预期结果:-

[
        {
            "_id": "5d5d7ce0c89852e7bad4a407",
            "max": "2019-10-10T:03:40:15.54Z", // max timestamp
            "zId": [
                "5d5d7ce0c89852e7bad4a4e1",
                "5d5d7ce0c89852e7bad4a4ef"
            ]
        },
        {
            "_id": "5d5d7ce0c89852e7bad4a408",
            "max": "2019-10-09T:02:50:15.54Z",
            "zId": [
                "5d5d7ce0c89852e7bad4a4ef"
            ]
        }, // ...etc 

    ]
回答如下:]中分组和过滤数据(获取像hits.hits._source这样的嵌套对象)时遇到了一些困难。

感谢您的文件。令人遗憾的是,我不知道只检索具有最大时间戳字段值的文档的任何方法。

以下查询将允许您按status筛选并按eId分组,然后获得最大时间戳值,但不会返回具有最大时间戳值的文档。

{
    "size": 0,
    "query": {
        "term": {
            "status": 1
        }
    },
    "aggregations": {
        "eId_group": {
            "terms": {
                "field": "eId"
            },
            "aggregations": {
                "max_timestamp": {
                    "max": {
                        "field": "timestamp"
                    }
                }
            }
        }
    }
}

此第二个查询使用top_hits聚合来检索按top_hits分组的文档。返回的文档通过减少时间戳记值进行排序,因此具有最大时间戳记的文档将是第一个,但是您也可能会获得具有不同时间戳记的文档。

eId

我为索引使用了以下映射

{
    "size": 0,
    "query": {
        "term": {
            "status": 1
        }
    },
    "aggregations": {
        "eId_group": {
            "terms": {
                "field": "eId"
            },
            "aggregations": {
                "max_timestamp": {
                    "max": {
                        "field": "timestamp"
                    }
                },
                "top_documents": {
                    "top_hits": {
                        "size": 20,
                        "sort": { "timestamp": "desc"}
                    }
                }
            }
        }
    }
}

Elasticsearch与MongoDB聚合

我正在将MongoDB查询转换为NodeJS平台中的Elasticsearch。在开发过程中,我像在MongoDB查询中一样,在Elasticsearch Query中处理grouping and filter数据(获取诸如hits.hits._source之类的嵌套对象)时遇到一些困难。

示例:-

UserModel.aggregate([
    {
        $match: {
            uId: req.body.uId, timestamp: { $gte: req.body.date, $lte: new Date() }
        },
    },
    {
        $group: {
            _id: "$eId",
            location: {
                $push: {
                    time: "$timestamp", lat: "$lat"
                }
            },
            timestamp: {
                $push: "$timestamp"
            },
            testId: { $first: "$testId" },
        }
    },
    {
        $project: {
            eId: 1, location: 1, testId: 1, max: { $max: "$timestamp" }
        }
    },
    { $unwind: { path: "$location", preserveNullAndEmptyArrays: true } },
    {
        $redact: {
            $cond: {
                if: { $eq: ["$location.time", "$max"] },
                then: "$$DESCEND",
                else: "$$PRUNE"
            }
        }
    },
    {
        $project: {
            eId: 1, latitude: "$location.lat", testId: 1
        }
    },
]).exec(function (err, result) {
    console.log(result)
});

Elasticsearch中的等效查询是什么?我正在寻找通过最小化嵌套响应对所需数据进行分组,展开和投影(从MongoDB概念到Elasticsearch)的解决方案。提前致谢。

编辑:-

添加Elasticsearch文档:-

{
          "timestamp": "2019-10-08T:02:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            2.000,
            34.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:02:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a408",
          "location": [
            2.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:03:50:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            4.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4ef"
},
{
          "timestamp": "2019-10-09T:03:40:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            2.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4e1"
},
{
          "timestamp": "2019-10-10T:03:40:15.54Z",
          "status" : 1,
          "eId": "5d5d7ce0c89852e7bad4a407",
          "location": [
            3.100,
            35.5664111801
          ],
          "zId": "5d5d7ce0c89852e7bad4a4e1"
}
  1. 状态为= 1,且按eId分组的比赛
  2. 具有该结果,按时间戳分组并获得最大时间戳值

预期结果:-

[
        {
            "_id": "5d5d7ce0c89852e7bad4a407",
            "max": "2019-10-10T:03:40:15.54Z", // max timestamp
            "zId": [
                "5d5d7ce0c89852e7bad4a4e1",
                "5d5d7ce0c89852e7bad4a4ef"
            ]
        },
        {
            "_id": "5d5d7ce0c89852e7bad4a408",
            "max": "2019-10-09T:02:50:15.54Z",
            "zId": [
                "5d5d7ce0c89852e7bad4a4ef"
            ]
        }, // ...etc 

    ]
回答如下:]中分组和过滤数据(获取像hits.hits._source这样的嵌套对象)时遇到了一些困难。

感谢您的文件。令人遗憾的是,我不知道只检索具有最大时间戳字段值的文档的任何方法。

以下查询将允许您按status筛选并按eId分组,然后获得最大时间戳值,但不会返回具有最大时间戳值的文档。

{
    "size": 0,
    "query": {
        "term": {
            "status": 1
        }
    },
    "aggregations": {
        "eId_group": {
            "terms": {
                "field": "eId"
            },
            "aggregations": {
                "max_timestamp": {
                    "max": {
                        "field": "timestamp"
                    }
                }
            }
        }
    }
}

此第二个查询使用top_hits聚合来检索按top_hits分组的文档。返回的文档通过减少时间戳记值进行排序,因此具有最大时间戳记的文档将是第一个,但是您也可能会获得具有不同时间戳记的文档。

eId

我为索引使用了以下映射

{
    "size": 0,
    "query": {
        "term": {
            "status": 1
        }
    },
    "aggregations": {
        "eId_group": {
            "terms": {
                "field": "eId"
            },
            "aggregations": {
                "max_timestamp": {
                    "max": {
                        "field": "timestamp"
                    }
                },
                "top_documents": {
                    "top_hits": {
                        "size": 20,
                        "sort": { "timestamp": "desc"}
                    }
                }
            }
        }
    }
}

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论