假设我有以下集合结构:
{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,所以应该有一个维护良好的数据库系统包。
最佳答案
为此,您需要使用 $sort
按 value
升序对文档进行排序运算符然后 $group
它们由 _id
并使用 $push
运算符返回“值”数组。从那里开始,因为聚合结果是一个数组,你可以使用 .map()
返回“键/值”数组的方法,其中 key
是 type
和 values
值中前两个元素的数组(由 .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/