查找和分组

时间:2015-06-05 08:09:16

标签: mongodb mongodb-query aggregation-framework

如果我的藏品中有以下文件

$(".solutions-items").on("mouseenter", "li", function() {
  $(".solutions-text-p p")
      .addClass("hidden")
      .eq($(this).index())
          .removeClass("hidden");
});

假设我想在hosting1或hosting2

中找到“cloud.google.com”

我会写一个像

这样的查询
{ "_id" : 1, "domainName" : "test1.com", "hosting1" : "hostgator.com",    "hosting2" : "hostgator.com",    sID : 1}
{ "_id" : 2, "domainName" : "test2.com", "hosting1" : "cloud.google.com", "hosting2" : "aws.amazon.com",   sID : 2}
{ "_id" : 3, "domainName" : "test3.com", "hosting1" : "aws.amazon.com",   "hosting2" : "cloud.google.com", sID : 2}

这将获取两条记录,如下面的

db.chats.find({$or : [{ hosting1 : 'cloud.google.com'}, { hosting2 : 'cloud.google.com'}]}).pretty(); 

假设我想查找并分组“sID”字段

假设我想在hosting1或hosting2中找到“cloud.google.com”,然后在“sID”中找到GROUPBY:2表示

我的结果将是

{ "_id" : 2, "domainName" : "test2.com", "hosting1" : "cloud.google.com", "hosting2" : "aws.amazon.com",   sID : 2}
{ "_id" : 3, "domainName" : "test3.com", "hosting1" : "aws.amazon.com",   "hosting2" : "cloud.google.com", sID : 2}

如何为我的上述要求编写查询

我的SQL查询将是

{ "_id" : 2, "domainName" : "test2.com", "hosting1" : "cloud.google.com", "hosting2" : "aws.amazon.com",   sID : 2}

我已经通过了mongoDB $ group但我无法正常工作

您能否告诉我如何实现这一目标。非常感谢您的帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用Mongo Aggregation$first使用$$ROOT,如下所示:

db.collection.aggregate({
    $match: {
    $or: [{
        "hosting1": "aws.amazon.com"
    }, {
        "hosting2": "aws.amazon.com"
    }]
    }
}, {
    $group: {
    "_id": "$sID",
    "domain": {
        $first: "$$ROOT"
    }
    }
})

$$ ROOT - 它总是引用根文档。这意味着当前正在聚合管道阶段处理的顶级文档。

$ first - 它返回将表达式应用于按键共享同一组的一组文档中的第一个文档所产生的值。仅在文档按照定义的顺序时才有意义。

您也可以使用简单的查找查询,例如 -

db.collection.find({
    $or: [{
    hosting1: 'cloud.google.com'
    }, {
    hosting2: 'cloud.google.com'
    }]
}).limit(1)

答案 1 :(得分:3)

在您的情况下,您不需要对文档进行分组。请改用$limit

db.collection.aggregate(
    [
      { $match: 
        { 
          $or : [
                  { hosting1 : 'cloud.google.com' }, 
                  { hosting2 : 'cloud.google.com'}
          ]
        }
      },
      { $limit: 1 }
    ]
)

此外,您确实没有需要聚合,您可以使用find方法。

db.collection.find({ 
    $or :[
           { hosting1 : 'cloud.google.com'},
           { hosting2 : 'cloud.google.com'}]
     }
).limit(1)