如何找到一个属性匹配而其他属性不同的x个文档

时间:2018-08-02 16:56:39

标签: javascript mongodb mongoose

好吧,想象一个这样的集合:

[
{
    "_id" : ObjectId("5b5f76eb2bfe4a1e9c473bd2"),
    "machine" : "NY-D800",
    "level" : "Fatal",
},
{
    "_id" : ObjectId("5b5f76eb2bfe4a1e9c473bd2"),
    "machine" : "NY-D889",
    "level" : "Fatal",
},
{
    "_id" : ObjectId("5b5f76eb2bfe4a1e9c473bd2"),
    "machine" : "NY-D889",
    "level" : "Info",
},
{
    "_id" : ObjectId("5b5f76eb2bfe4a1e9c473bd2"),
    "machine" : "NY-D800",
    "level" : "Fatal",
},
...
]

我想查找level设置为“致命”的文档,但我不想返回重复的文档(重复的machine)。因此,例如“ NY-D800”在“ Fatal”中列出了两次,因此我希望只返回一次。最后,我想将返回的值限制为10个项目。

重新设置:

  1. level ='致命'
  2. 仅由machine确定的唯一值
  3. 最多10个文档

MongoDB可以在MongoDB中实现吗?

我尝试过:

 Logs
    .distinct({'level': 'Fatal'})
    .limit(10)
    .exec(function (err, response){
        var result = {
            status: 201,
            message: response
        };
        if (err){
            result.status = 500;
            result.message = err;
        } else if (!response){
            result.status = 404;
            result.message = err;
        }
        res.status(result.status).json(result.message);
    });

1 个答案:

答案 0 :(得分:1)

您可以先用level“致命”来$match,然后用machine来应用$group

Logs.aggregate([
  { "$match": { "level": "Fatal" }},
  { "$group": {
    "_id": "$machine",
    "level": { "$first": "$level" },
  }},
  { "$limit": 10 },
  { "$project": { "machine": "$_id", "level": 1, "_id": 0 }}
])