2016-02-29 3 views
1

У меня есть этот документ MongoDB:

{ 
    "_id" : 1, 
    title: "abc123", 
    isbn: "0001122223334", 
    author: { last: "zzz", first: "aaa" }, 
    copies: 5 
} 

Использование $project (оператор агрегации) Я должен изменить предыдущую схему, чтобы получить:

{ 
    "_id" : 1, 
    field: {key:"title", value:"abc123"}, 
    isbn: "0001122223334", 
    author: { last: "zzz", first: "aaa" }, 
    copies: 5 
} 

Для достигла моей цели. Я использовал следующую агрегацию:

db.book.aggregate([{$project: {"field": {"key":"title", "value":"$title"}}}]) 

, но я получил ошибку:

{ 
"ok" : 0, 
"errmsg" : "FieldPath 'isbn' doesn't start with $", 
"code" : 16873 
} : aggregate failed 

Я не понимаю, почему это агрегация не работает, так как если я хочу, чтобы изменить предыдущую схему, чтобы получить:

{ 
"_id" : 1, 
"author" : { 
    "last" : "zzz", 
    "first" : "aaa" 
    }, 
"copies" : 5, 
"fieldTitle" : { 
     "key" : "abc123" 
     } 
} 

я могу использовать эту агрегацию (и это работает):

db.book.aggregate([{$project: {_id:1, fieldTitle:{key:"$title"}, author:1, copies:1}}]) 

ответ

1

Используйте оператор в $literal возвращать значение без разбора. Он используется для значений, что трубопровод агрегация может интерпретировать как выражение, как ошибки вы в настоящее время становится все:

db.book.aggregate([ 
    { 
     $project: { 
      "field.key": { "$literal": "title" }, 
      "field.value": "$title", 
      "author": 1, "copies": 1    
     } 
    } 
]) 

Пример вывода

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "author" : { 
       "last" : "zzz", 
       "first" : "aaa" 
      }, 
      "copies" : 5, 
      "field" : { 
       "key" : "title", 
       "value" : "abc123" 
      } 
     } 
    ], 
    "ok" : 1 
} 
Смежные вопросы