mongodb:如何获得按子数组字段排序的文档的限制数量?
我的mongodb收藏是这样的mongodb:如何获得按子数组字段排序的文档的限制数量?,mongodb,Mongodb,我的mongodb收藏是这样的 /* 1 */ { "_id" : ObjectId("5d93fa1a5261dfb4940f166f"), "hash" : "1", "transfers" : [ { "symbol" : "aba", "from" : "sh", "to" : "jh", "amount" : 123.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
}
]
}
我想做的是根据子数组传输的字段数量
提取有限数量的已排序集合
当我试图用这个命令
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}])