2015-04-08 2 views
2

Вот мой код в mongodb:.Добавление hardcoded свойства в json-выход

db.mydb.aggregate([ 
    { "$group": { 
     "_id": { 
      "A": "$A", 
      "B": "$B", 
      "C": "$C" 
     }, 

    }}, 
    { "$group": { 
     "cpt": { '$sum': 1 } , 
     "_id": "$_id.A", 
     "allowDrag": {'$literal':false}, 
     "expanded": {'$literal':false}, 
     "children": { 
      "$push": { 
       "text": "$_id.B", 
       "details": "$_id.C", 
       "leaf": {'$literal': true}, 

      } 
     }, 


    }} 
]) 

Я хотел бы добавить в мой вывод JSon некоторые жёстко прописанные свойства и значения, он работает с

"лист": { '$ буквальным': истинный}

но Я не знаю, почему я не могу сделать это с

"allowDrag": { '$ буквальным' ложь}, "расширил": { "$ Lit eral ': false}

Возможно ли это с помощью группы $ group?

Пример вывода JSON У меня есть:

"result" : [ 
     { 
      "_id" : "A", 
      "cpt" : 1, 
      "children" : [ 
       { 
        "text" : "B", 
        "details" : "C", 
        "leaf" : true 
       } 
      ] 
     }] 

Пример вывода JSON Я бы хотел:

"result" : [ 
     { 
      "_id" : "A", 
      "cpt" : 1, 
      "allowDrag" : false, 
      "expanded" : false, 
      "children" : [ 
       { 
        "text" : "B", 
        "details" : "C", 
        "leaf" : true 
       } 
      ] 
     }] 

ответ

2

Используйте $literal оператор в $project трубопроводе вернуть новый поля установлены на логические значения:

db.mydb.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "A": "$A", 
       "B": "$B", 
       "C": "$C" 
      } 
     } 
    }, 
    { 
     "$group": { 
      "cpt": { '$sum': 1 } , 
      "_id": "$_id.A",   
      "children": { 
       "$push": { 
        "text": "$_id.B", 
        "details": "$_id.C", 
        "leaf": {'$literal': true}  
       } 
      } 
     }  
    }, 
    { 
     "$project": { 
      "allowDrag": {'$literal':false}, 
      "expanded": {'$literal':false}, 
      "cpt": 1, 
      "children": 1 
     }  
    } 
]) 

Протестировано wi го следующего образца коллекции:

db.mydb.insert([ 
    { 
     "A": "test1", 
     "B": "test2", 
     "C": "test3" 
    }, 
    { 
     "A": "test1", 
     "B": "test2", 
     "C": "test2" 
    }, 
    { 
     "A": "test2", 
     "B": "test2", 
     "C": "test3" 
    }, 
    { 
     "A": "test2", 
     "B": "test2", 
     "C": "test3" 
    } 
]) 

выше агрегации дает следующие результаты:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "test1", 
      "cpt" : 2, 
      "children" : [ 
       { 
        "text" : "test2", 
        "details" : "test2", 
        "leaf" : true 
       }, 
       { 
        "text" : "test2", 
        "details" : "test3", 
        "leaf" : true 
       } 
      ], 
      "allowDrag" : false, 
      "expanded" : false 
     }, 
     { 
      "_id" : "test2", 
      "cpt" : 1, 
      "children" : [ 
       { 
        "text" : "test2", 
        "details" : "test3", 
        "leaf" : true 
       } 
      ], 
      "allowDrag" : false, 
      "expanded" : false 
     } 
    ], 
    "ok" : 1 
} 
+0

Проблема заключается в том, что вы не можете проецировать поля, отсутствующие в '$ group' стадии, если ОП не требуется добавить новые поля. Возможно, я ошибаюсь. – styvane

+0

@Michael Вы пробовали? ** '$ literal' ** возвращает значение без разбора. Выражение '' allowDrag ": {$ literal: false}' возвращает новое поле 'allowDrag', установленное на значение false. OP сказал: я хотел бы добавить в свой json-выход некоторые жестко заданные свойства и значения. – chridam

+0

извините, не понял этого. +1 :) – styvane

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