Javascript 按类型获取按字母顺序排列的前两个文档
假设我有以下集合结构:Javascript 按类型获取按字母顺序排列的前两个文档,javascript,mongodb,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongodb Query,Aggregation Framework,假设我有以下集合结构: {type: 1, value: "f"}, {type: 2, value: "c"}, {type: 2, value: "b"}, {type: 1, value: "d"}, {type: 1, value: "e"}, {type: 2, value: "a"} 现在,我想获得每个“类型”的2个按字母顺序排列的第一个文档(“值”),结果如下所示: {type: 1, value: "d"}, {type: 1, value: "e"}, {type: 2, v
{type: 1, value: "f"},
{type: 2, value: "c"},
{type: 2, value: "b"},
{type: 1, value: "d"},
{type: 1, value: "e"},
{type: 2, value: "a"}
现在,我想获得每个“类型”的2个按字母顺序排列的第一个文档(“值”),结果如下所示:
{type: 1, value: "d"},
{type: 1, value: "e"},
{type: 2, value: "a"},
{type: 2, value: "b"},
使用MongoDB,我必须检索所有文档并删除不必要的文档
是否还有其他具有内置功能的NoSQL系统可以做到这一点
另一个整洁的要求是可以简单地更新一个二维以上的嵌套文档,这在MongoDB中也是不可能的,因为您只能使用位置运算符“$”一次(请参阅)。我需要至少3维的文档,我已经想过了,其他的一切都意味着阅读时性能的巨大下降
或者在我错过的MongoDB中是否有这样做的可能性
我与golang合作,因此DB系统应该有一个维护良好的包。图形数据库可能是MongoDB的一个不错的替代品,因为它们更适合关系建模。您不必在每个文档中重复一个类型,您可以从中创建一个节点 根据您对数据建模的方式,您询问的任务可能更简单或更困难。不确定是否有机会使用内置的开箱即用解决方案,但在最坏的情况下,您可以简单地将您的值链接为通过关系连接的节点,为每种类型维护某种排序的值列表,这将使获取每种类型的N个顶级值变得容易(并且您不必检索不必要的数据) Neo4j有一个支持Go的版本,但不确定它是否成熟
谈到MongoDB,您也可以尝试使用它自己的。我对它不太熟悉,但似乎有点难,因为$group AGGRATION限制了可能的累加器的数量(您可能需要对$push应用限制,但似乎不可能) 要执行此操作,您需要使用运算符按
值
按升序对文档进行排序,然后按\u id
对文档进行排序,并使用运算符返回“值”数组。因此,由于聚合结果是一个数组,您可以使用返回“键/值”数组的方法,其中key
是type
和value
值中前两个元素的数组(按或返回)
输出
[
{
"type" : 1,
"values" : [ "d", "e" ]
},
{
"type" : 2,
"values" : [ "a", "b" ]
}
]
从MongoDB 3.2开始,您可以在$project
阶段使用操作符
db.collection.aggregate([
{ "$sort": { "value": 1 }},
{ "$group": { "_id": "$type", "values": { "$push": "$value" }}},
{ "$project": { "values": { "$slice": [ "$values", 0, 2 ] }}}
])
非常感谢你!这对我解决问题有很大帮助。
db.collection.aggregate([
{ "$sort": { "value": 1 }},
{ "$group": { "_id": "$type", "values": { "$push": "$value" }}},
{ "$project": { "values": { "$slice": [ "$values", 0, 2 ] }}}
])