Gostaria de definir um estágio de agregação do projeto $, no qual posso instruí-lo a adicionar um novo campo e incluir todos os campos existentes, sem precisar listar todos os campos existentes.
Meu documento fica assim, com muitos campos:
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
Eu quero fazer uma operação de agregação como esta:
[
{
$project: {
custom_field: "$obj.obj_field1",
//the next part is that I don't want to do
field1: 1,
field2: 1,
...
field26: 1
}
},
... //group, match, and whatever...
]
Existe algo como uma palavra-chave "incluir todos os campos" que eu possa usar neste caso ou alguma outra maneira de evitar a necessidade de listar todos os campos separadamente?
mongodb
mongodb-query
aggregation-framework
samuelluis
fonte
fonte
Respostas:
No 4.2+, você pode usar o
$set
operador de pipeline de agregação, que nada mais é do que um alias a ser$addFields
adicionado no 3.4fonte
$addFields
é novo no MongoDB 3.4 que é suportado pela versão do driver C # 2.5+IAggregateFluent<TResult>.AppendStage(new JsonPipelineStageDefinition<TInput, TOutput>("{ $addFields : { myField: 'myValue' }}")
Você pode usar $$ ROOT para referenciar o documento raiz. Mantenha todos os campos deste documento em um campo e tente obtê-lo depois disso (dependendo do sistema do cliente: Java, C ++, ...)
fonte
document
uma opção para um criado fundiu doc teria sido melhor ...custom_field
anexo.const newObj = { ...result.document, custom_field: result.custom_field }
>>> Existe algo como a palavra-chave "incluir todos os campos" que eu possa usar neste caso ou em alguma outra solução?
Infelizmente, não há operador para "incluir todos os campos" na operação de agregação. A única razão pela qual, porque a agregação é criada principalmente para agrupar / calcular dados dos campos da coleção (soma, média, etc.) e retornar todos os campos da coleção não é um objetivo direto.
fonte
posts
com campos _id, title, body, likes. O campo de curtidas é uma matriz de usuários _id que gostam da postagem. Como você pode listar todas as postagens com todos os _id, título, corpo e likeCount? Retornar todos os campos é um objetivo direto neste caso.A partir da versão 2.6.4, o Mongo DB não possui esse recurso para o
$project
pipeline de agregação. Dos documentos para$project
:e
fonte
Para adicionar novos campos ao seu documento, você pode usar
$addFields
de documentos
e para todos os campos do seu documento, você pode usar
$$ROOT
fonte
de acordo com a resposta da @Deka, para o driver do c # mongodb 2.5, você pode obter o documento agrupado com todas as teclas abaixo;
fonte