我怎样才能得到(Node.js)具有明显值的MongoDB文档,其中一些其他值最低?

时间:2014-03-27 01:43:12

标签: node.js mongodb distinct

我有一个这样的集合:

{
    name : 'a',
    value: 10,
    word : 'baz'
},
{
    name : 'a',
    value: 65,
    word : 'bar'
},
{
    name : 'a',
    value: 3,
    word : 'foo'
},
{
    name : 'b',
    value: 110,
    word : 'bar'
},
{
    name : 'b',
    value: 256,
    word : 'baz'
}

如何执行导致选择name唯一且<{1}}最低的完整文档的查询?value最低? E.g:

{
    name : 'a',
    value: 3,
    word : 'foo'
},
{
    name : 'b',
    value: 110,
    word : 'bar'
}

1 个答案:

答案 0 :(得分:2)

您可以使用$min中的aggregation framework运算符,通过以下查询实现您的目标:

db.collection.aggregate([
    {$group:{_id:"$name", value:{$min:"$value"}}}, 
    {$limit:2}
])

此查询将返回:

{
        "result" : [
                {
                        "_id" : "b",
                        "value" : 110
                },
                {
                        "_id" : "a",
                        "value" : 3
                }
        ],
        "ok" : 1
}

如果您希望对结果进行排序,还可以在管道中包含$sort阶段。

编辑:您可以使用简洁的小技巧选择$ group&quot; _id字段中未包含的其他元素。首先对文档进行排序,然后使用$first运算符:

db.collection.aggregate([
    {$sort:{value:1}},
    {$group:{_id:"$name", value:{$min:"$value"}, word:{$first:"$word"}}} 
])

此查询将返回:

{
        "result" : [
                {
                        "_id" : "b",
                        "value" : 110,
                        "word" : "bar"
                },
                {
                        "_id" : "a",
                        "value" : 3,
                        "word" : "foo"
                }
        ],
        "ok" : 1
}