Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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
Javascript 按类型获取按字母顺序排列的前两个文档_Javascript_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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 ] }}}
])