javascript - 按类型获取 2 个按字母顺序排列的第一个文档

标签 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, value: "a"},
{type: 2, value: "b"},

使用 MongoDB 我必须检索所有文档并删除不需要的文档。

是否有另一个 NoSQL 系统具有内置功能来执行此操作?

另一个巧妙的要求是可以简单地更新超过 2 维的嵌套文档,这在 MongoDB 中也是不可能的,因为您只能使用位置运算符“$”一次(参见 https://jira.mongodb.org/browse/SERVER-831)。我至少需要 3 维文档,我已经想通了,其他一切都意味着阅读时性能会大幅下降。

或者是否有可能在我缺少的 MongoDB 中做到这一点?

我正在使用 golang,所以应该有一个维护良好的数据库系统包。

最佳答案

为此,您需要使用 $sortvalue 升序对文档进行排序运算符然后 $group它们由 _id 并使用 $push运算符返回“值”数组。从那里开始,因为聚合结果是一个数组,你可以使用 .map()返回“键/值”数组的方法,其中 keytypevalues 值中前两个元素的数组(由 .splice() 返回)或 .slice() )

db.collection.aggregate([
    { "$sort": { "value": 1 }}, 
    { "$group": { "_id": "$type", "values": { "$push": "$value" }}}
]).map( function( doc ) { 
          return { "type": doc._id, "values": doc.values.splice(0, 2) }})

输出

 [
     {
         "type" : 1,
         "values" : [ "d", "e" ]
     },
     {
         "type" : 2,
         "values" : [ "a", "b" ]
     }
]

从 MongoDB 3.2 开始,您可以使用 $slice您的 $project 阶段中的运算符。

db.collection.aggregate([
    { "$sort": { "value": 1 }}, 
    { "$group": { "_id": "$type", "values": { "$push": "$value" }}},
    { "$project": { "values": { "$slice": [ "$values", 0, 2 ] }}}
])

关于javascript - 按类型获取 2 个按字母顺序排列的第一个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31940862/

相关文章:

javascript - 是否有可能以良好的形式在 Angular 中重用相同的数据工厂?

javascript - 参数 "is not a function"的 Protractor 属性

node.js - 游标.sort()和聚合$sort之间的区别

javascript - Mongodb:子文档数组的聚合值

python - 将 MongoDB(3.0) 集合的子集保存到 Python 中的另一个集合

javascript - jquery ajax 没有从 MVC Controller 返回成功函数

Javascript - 将 this 参数绑定(bind)到 Promise

ruby-on-rails - 带有rails的mongodb,通过数组中的id查找

mongodb - 使用带有条件的 $graphLookup

java - Spring 数据 - 从分组中计算不同的项目