2014-09-05 55 views
1

我需要在mongodb集合上执行聚合。我遇到的问题是我需要在组功能中执行OR操作。MongoDB聚合 - 可能在组功能中有OR操作符?

我的文档具有不同的键值,理想情况下它们应该是相同的。我被这些值卡住了,所以我不能只是规范化数据。

例如,集合有一个电子邮件领域中的三个不同的字段值:

{ 
    _id : 1, 
    name : "docType1", 
    e_mail : "[email protected]" 
} 
{ 
    _id : 2, 
    name : "docType2", 
    email : "[email protected]" 
} 
{ 
    _id : 3, 
    name : "docType3", 
    mail : "[email protected]" 
} 

是否可以进行群组功能,通过电子邮件值的组的文件,一旦密钥是企业邮箱,电子邮件或邮件?

也许它可能与一个项目组合,但我迄今为止的尝试失败了,我想我还需要一个OR?

回答

3

是的,它可能与aggregation framework。基本上,您需要与$ifNull运营商进行测试,并使用第二个条件的嵌套形式:

db.collection.aggregate([ 
    { "$group": { 
     "_id": { "$ifNull": [ 
      "$e_mail", 
      { "$ifNull": [ 
       "$email", 
       { "$ifNull": [ 
        "$mail", 
        false 
       ]} 
      ]} 
     ]}, 
     "count": { "$sum": 1 } 
    }}, 
    { "$match": { "_id": { "$ne": false } } } 
]) 

所以$ifNull有两个参数,第一个是要测试它回来,在那里它的存在或不为空场,第二个是在条件不是true的情况下返回的替代值。

+0

这符合我有的限制。我能看到的唯一问题是,如果出于某种原因,“docType2”会有一个名为e_mail和email的字段。它会尝试使用应该使用电子邮件字段的e_mail字段将docType2分组。我知道这个特殊的例子不是很好,但它是我所拥有的数据中的一种可能情景,并且我认为我会突出显示其他任何查看相同问题的人。 – Travis 2014-09-08 07:58:43