Je voudrais définir une étape d'agrégation $ project où je peux lui demander d'ajouter un nouveau champ et d'inclure tous les champs existants, sans avoir à lister tous les champs existants.
Mon document ressemble à ceci, avec de nombreux champs:
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
Je veux faire une opération d'agrégation comme celle-ci:
[
{
$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-t-il quelque chose comme un mot-clé "inclure tous les champs" que je peux utiliser dans ce cas, ou une autre façon d'éviter d'avoir à lister chaque champ séparément?
mongodb
mongodb-query
aggregation-framework
samuelluis
la source
la source
Réponses:
Dans 4.2+, vous pouvez utiliser l'
$set
opérateur de pipeline d'agrégation qui n'est rien d'autre qu'un alias$addFields
ajouté dans 3.4la source
$addFields
est nouveau dans MongoDB 3.4 qui est pris en charge par le pilote C # version 2.5+IAggregateFluent<TResult>.AppendStage(new JsonPipelineStageDefinition<TInput, TOutput>("{ $addFields : { myField: 'myValue' }}")
Vous pouvez utiliser $$ ROOT pour faire référence au document racine. Conservez tous les champs de ce document dans un champ et essayez de l'obtenir par la suite (en fonction de votre système client: Java, C ++, ...)
la source
document
une option pour créer un document fusionné aurait été plus agréable ...custom_field
attaché.const newObj = { ...result.document, custom_field: result.custom_field }
>>> Il y a quelque chose comme le mot-clé "inclure tous les champs" que je peux utiliser dans ce cas ou une autre solution?
Malheureusement, il n'y a pas d'opérateur pour "inclure tous les champs" dans l'opération d'agrégation. La seule raison, pourquoi, parce que l'agrégation est principalement créée pour regrouper / calculer les données des champs de collection (somme, moyenne, etc.) et retourner tous les champs de la collection n'est pas un but direct.
la source
posts
avec des champs _id, title, body, likes. Le champ J'aime est un tableau de _id d'utilisateur qui aiment le message. Comment pouvez-vous lister tous les messages avec tous les _id, title, body, likeCount? Le renvoi de tous les champs est un objectif direct dans ce cas.Depuis la version 2.6.4, Mongo DB ne dispose pas d'une telle fonctionnalité pour le
$project
pipeline d'agrégation. À partir de la documentation pour$project
:et
la source
Pour ajouter de nouveaux champs à votre document, vous pouvez utiliser
$addFields
à partir de documents
et pour tous les champs de votre document, vous pouvez utiliser
$$ROOT
la source
selon @Deka reply, pour c # mongodb driver 2.5, vous pouvez obtenir le document groupé avec toutes les touches comme ci-dessous;
la source