2015-10-14 81 views
2

我有一个文件的集合,其中一个字段的名称是不同的,但它意味着同样的事情。 所以我希望能够做类似SQL CASE语句的东西:MongoDB查询选择一个字段,如果其他为空

SELECT CASE 
     WHEN field1 IS NULL THEN field2 
     ELSE field1 

最重要的是,我需要做一个汇总:

db.coll.aggregate(
    [ 
    { 
     $group: 
     { 
      _id: "fieldID", 
      maxThing: { $max: { $divide: [ "fieldA", "fieldB" ] } } 
      ELSE IF fieldA IS NULL 
      maxThing: { $max: { $divide: [ "fieldC", "fieldD" ] } } 
     } 
    } 
    ] 
) 

想法?

谢谢!

+0

您的解释不明确,请尝试重构您的查询并添加一些关于您的文档模式设计的代码。 – sergiuz

回答

2

最好使用$ifNull运营商在聚集管道:

对于第一种情况,你可以在$project流水线阶段使用它:

db.coll.aggregate([ 
    { 
     $project: { 
      "item": 1, 
      "field1": { "$ifNull": [ "$field1", "$field2" ] } 
     } 
    } 
]) 

至于其他的情况:

db.coll.aggregate([ 
    { 
     $group: { 
      "_id": "$fieldID", 
      "maxThing": { 
       "$max": { 
        "$divide": [ 
         { "$ifNull": [ "$fieldA", "$fieldC" ] } , 
         { "$ifNull": [ "$fieldB", "$fieldD" ] } 
        ] 
       } 
      }  
     } 
    } 
]) 
+0

{$ project:{field ... ifnull ....}}有效。聚合也适用。但是,总计只有*一半*的作品。它只提供结果,如果提供的一个字段为空。 – Bear

+0

看起来像[**原始问题**](http://stackoverflow.com/questions/33136093/mongodb-query-select-one-field-if-the-other-is-null)解决不是它?至于上述评论,这将是Stack Exchange站点上的一个** [不同的问题](http://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions),“变色龙问题”不太受欢迎“)**,请考虑单独发布。 – chridam

0

我收回它。它确实工作,使用它在这个简单的测试案例,下面。但在我的生产环境中,它失败了。有些地方一定是不对的。我需要弄清楚。

JSON: 
{ 
    "id" : "Identifier A", 
    "fieldA" : 1, 
    "fieldB" : 2 
}, 
{ 
    "id" : "Identifier B", 
    "fieldC" : 3, 
    "fieldD" : 4 
} 

QUERY: 
db.test.aggregate(
    [{ 
     $group: { 
      _id: "$id", 

      maxOfDiv: { 
       $max: { 
        $divide: [{ 
         "$ifNull": ["$fieldA", "$fieldC"] 
        }, { 
         "$ifNull": ["$fieldB", "$fieldD"] 
        }] 
       } 
      } 
     } 
    }] 
) 
相关问题