2014-12-15 8 views
11

Więc muszę pola niestandardowego obliczoną MongoDB następująco

if(field1 =="A") ->customfield=10 
else if(field1 =="B" )->customfield=20 
else (field1 =="C") ->customfield=15 

Używam agregacji wraz z oświadczeniem $ projektu. Ale operator $ cond nie zezwala na elseif (subrananizacja innego) i pozwala tylko na dwie statyczne gałęzie, jeśli i jeszcze. Korzystanie z zagnieżdżonych ElseIf powoduje

"exception: field inclusion is not allowed inside of $expressions"

Herezje mój kwerendy (co daje mi błąd)

db.items.aggregate([ { $project : 
{ 
    name: 1, 
    customfield: 
    { 
     $cond: { if: { $eq: [ "$field1", "4" ] }, then: 30, 
       else: { 
        if: 
        { $eq: ["$field1","8"]}, 
        then: 25, else: 10}} 
       } 
      }},{ $sort: { customfield: 1 }},{$limit:12}]); 

Czy istnieje metoda lub obejście tego. Przepraszam, jeśli to powtarzające się pytanie, ale nie mogłem znaleźć podobnego.

+0

Trzeba "$ pole1", a następnie "Field1". Typo? –

+0

Dzięki, ale to było wynikiem mojego pośpiechu (podczas pisania). Zmieniono to tak, aby odzwierciedlało pierwotne zapytanie, przeprosiny za zamieszanie. – humblerookie

+0

Nie jestem w 100% pewny, ale nie sądzę, że istnieje jakaś składnia, która może skrócić twoje zapytanie. Będziesz musiał zagnieździć 'if 'wewnątrz' else'. – ujvl

Odpowiedz

22

W if..then..else słowo aby operator $cond to tylko najnowszy dodatek jak w ostatnich wersjach MongoDB w czasie pisania. Chodziło o jasność, ale w tym przypadku wydaje się, że spowodowało to pewne zamieszanie.

Operator $cond jako operator $cond jest rzeczywiście operatorem , podobnie jak w wielu językach programowania. Oznacza to, że zamiast "blokować" logikę warunkom, jako warunkowe, wszystko, co nie spełnia pierwszego warunku, należy do zakresu else.

dlatego „zagnieździć” oświadczenia zamiast następują bloki:

db.items.aggregate([ 
    { "$project": { 
     "name": 1, 
     "customfield": { 
      "$cond": { 
       "if": { "$eq": [ "$field1", "4" ] }, 
       "then": 30, 
       "else": { 
        "$cond": { 
         "if": { "$eq": ["$field1","8"]}, 
         "then": 25, 
         "else": 10 
        } 
       } 
      } 
     } 
    }}, 
    { "$sort": { customfield: 1 }}, 
    { "$limit":12 } 
]); 

Ternary to trzy warunki, nie więcej nie mniej. Tak więc cała logika if..then..else musi być zagnieżdżona.

+0

Och, tak chciałbym, U wcześniej wpisałem trochę wcześniej, zanim to poprawiłem sam. Nonethelss oznaczałoby to jako odpowiedź, Dzięki – humblerookie

+0

@ neil-lunn: Tęskniłeś za podwójnym cytatem po tym słowie kluczowym w innej części –

+0

, że zapytanie jest poprawne. Chcę tylko zakodować powyższe zapytanie w C++ za pomocą mongo :: BSONArrayBuilder aBuilder; czy ktoś może mi pomóc? jak poniżej mongo :: BSONArrayBuilder aBuilder; aBuilder.append (BSON (*** trzeba zbudować zapytanie tutaj z $ cond **); mongo :: BSONArray aAggregationQuery = aBuilder.arr(); _Collection.aggregate (aAggregationQuery) ... – PAL

Powiązane problemy