2015-10-14 9 views
2

У меня есть коллекция документов, где одно имя поля отличается, но это означает одно и то же. Поэтому я хочу, чтобы иметь возможность сделать что-то подобное заявление СЛУЧАЯ SQL:MongoDB Query ВЫБЕРИТЕ одно поле, если другое значение равно нулю

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 ....}}. И агрегат также работает. Однако агрегат только * половина * работает. Он дает только результат, если одно из предоставленных полей равно null. – Bear

+0

Похоже, [** оригинальная проблема **] (http://stackoverflow.com/questions/33136093/mongodb-query-select-one-field-if-the-other-is-null) решена, не так ли ? Что касается вышеприведенных комментариев, это будет ** [другой вопрос] (http://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions) на сайтах Stack Exchange, «вопросы хамелеона», не очень приветствуются ") **, рассмотрите возможность публикации отдельно. – chridam

0

Я забираю его обратно. It делает работа, используя его на этом простом тестовом примере, ниже. Но в моем производстве это терпит неудачу. Что-то должно быть где-то не так. Мне нужно это понять.

Смежные вопросы