mongodb:如何获取按子数组字段排序的文档的限制数量?

时间:2019-10-02 01:47:06

标签: mongodb

我的mongodb收藏是这样的

/* 1 */
{
    "_id" : ObjectId("5d93fa1a5261dfb4940f166f"),
    "hash" : "1",
    "transfers" : [ 
        {
            "symbol" : "aba",
            "from" : "sh",
            "to" : "jh",
            "amount" : 123.0
        }, 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 12321.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d93fac65261dfb4940f1670"),
    "hash" : "2",
    "transfers" : [ 
        {
            "symbol" : "cbc",
            "from" : "sh",
            "to" : "jh",
            "amount" : 222.0
        }, 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 333.0
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5d93fead5261dfb4940f1672"),
    "hash" : "3",
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "sh",
            "to" : "jh",
            "amount" : 333.0
        }, 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 444.0
        }
    ]
}

我要做的是根据子数组amount的{​​{1}}字段提取有限数量的排序集合

当我尝试使用此命令时

transfers

返回如下

db.getCollection('sh_test_transaction').find({"transfers.symbol":"bob"}).sort({'transfers.amount':-1}).limit(2)

但是我想要的结果是这样的

/* 1 */
{
    "_id" : ObjectId("5d93fa1a5261dfb4940f166f"),
    "hash" : "1",
    "block_number" : 1.0,
    "transfers" : [ 
        {
            "symbol" : "aba",
            "from" : "sh",
            "to" : "jh",
            "amount" : 123.0
        }, 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 12321.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d93fead5261dfb4940f1672"),
    "hash" : "3",
    "block_number" : 3.0,
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "sh",
            "to" : "jh",
            "amount" : 333.0
        }, 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 444.0
        }
    ]
}

(我不需要更改原始数据)

由于我是mongodb world的新手,因此需要您的帮助。

谢谢你〜!

1 个答案:

答案 0 :(得分:0)

您想要所有条目中最高的两个金额吗?听起来您需要使用聚合框架。但是您还希望它们嵌入原始文档中吗?没有文档中可能存在的其他传输?

我不记得确切的命令,但我会这样尝试:

  • 首先,您需要提取传输并可能在其中添加周围的文档,这可能是flatMap和地图的组合?因此A {B,C}变为B {A},C {A}
  • 然后您需要按金额排序
  • 然后将结果限制为两个条目。但是,如果多个结果具有相同的值怎么办?不一样
  • 然后还原flatMap操作并将C {A},G {D}转换为A {C},G {D}。如果两个结果都在同一个文档中,那么这里可能需要加入,因此C {A},B {A}将成为一个文档A {C,B},而不是两个文档A {C},A {B}
  • 您甚至需要原始文件还是仅需要转移部分?会使算法更容易。或者您只存储外部文档的ID,以后再查找。

在设计聚合函数之前,有很多东西要首先考虑,但这确实值得!

如果您只是在学习,请尝试编写一个普通查询,该查询将获取所有条目并手动执行所有操作,并根据最高的两个元素检查每个元素。比较聚合的速度。

快乐的编码!

第一次开始就是这样,根据您的要求,您将不得不做更多的伏都教徒:)

db.sh_test_transaction.aggregate([
   { $match: { "transfers.symbol": "bob" } },
   { $unwind : "$transfers" },
   { $sort : { "transfers.amount" : -1 } },
   { limit: 2 },
....
])