Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb:如何获得按子数组字段排序的文档的限制数量?_Mongodb - Fatal编程技术网

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

mongodb:如何获得按子数组字段排序的文档的限制数量?,mongodb,Mongodb,我的mongodb收藏是这样的 /* 1 */ { "_id" : ObjectId("5d93fa1a5261dfb4940f166f"), "hash" : "1", "transfers" : [ { "symbol" : "aba", "from" : "sh", "to" : "jh", "amount" : 123.0 },

我的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
        }
    ]
}
/* 1 */
{
    "_id" : ObjectId("5d93fa1a5261dfb4940f166f"),
    "hash" : "1",
    "block_number" : 1.0,
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 12321.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d93fead5261dfb4940f1672"),
    "hash" : "3",
    "block_number" : 3.0,
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 444.0
        }
    ]
}
我想做的是根据子数组
传输的
字段
数量
提取有限数量的已排序集合 当我试图用这个命令

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
        }
    ]
}
但我想要的结果是这样的

/* 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
        }
    ]
}
/* 1 */
{
    "_id" : ObjectId("5d93fa1a5261dfb4940f166f"),
    "hash" : "1",
    "block_number" : 1.0,
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 12321.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d93fead5261dfb4940f1672"),
    "hash" : "3",
    "block_number" : 3.0,
    "transfers" : [ 
        {
            "symbol" : "bob",
            "from" : "yh",
            "to" : "sh",
            "amount" : 444.0
        }
    ]
}
(我不需要更改原始数据)

因为我是mongodb world的新手,我需要你的帮助


提前谢谢~

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

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

  • 首先,您需要提取传输,并可能在其中添加周围的文档,这可能是一个平面图和一个组合图?所以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,稍后再进行查找
在设计聚合函数之前,首先要考虑很多东西,但它确实是值得的!p> 如果您只是在学习,请尝试编写一个普通的查询,该查询获取所有条目并手动执行所有这些操作,将每个元素与最高的两个元素进行检查。比较聚合的速度

快乐编码

第一次开始是这样的,根据你的要求,你必须做更多的伏都教:)

谢谢你的回答:)这对我真的很有帮助。最后,我喜欢这个
db.getCollection('sh_test_transaction').aggregate([{$unwind:“$transfers”},{$match:{“transfers.symbol:“bob”},{$sort:{“transfers.amount”:-1},{$limit 2}])