Je voudrais exclure un champ d'un pipeline mongo db aggergtion, après avoir lu la documentation, j'ai pensé qu'il fallait spécifier 1 ou 0 pour garder le champ ou non (cf. http://docs.mongodb.org/manual/ référence / opérateur / agrégation / projet / )
J'ai donc essayé ce qui suit (en utilisant node.js mongoose, mais la syntaxe est assez similaire à celle de plain mongo):
aggregate.match({ date: { $gte : today } });
aggregate.sort('-date');
aggregate.group({
_id: '$name',
date: { $first: '$date' },
user: { $first: '$user' },
app: { $first: '$app' }
});
aggregate.project({
_id: 1,
last: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$date', 0 ] },
user: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$user', 0 ] },
app: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$app', 0 ] }
});
Mais en faisant cela, je termine avec des documents comme celui-ci:
[
{
_id: 'devices',
user: 0,
app: 0,
last: 0
},
{
_id: 'undo',
user: 'test',
app: 'truc',
last: Mon Jan 26 2015 16:21:53 GMT+0100 (CET)
}
]
Je veux que le user
, app
et date
n'apparaisse que quand _id
est undo
.
Comment y parvenir?
Merci!
À partir de mongoDB 3.6, vous pouvez utiliser la variable REMOVE pour exclure des champs de manière conditionnelle.
Dans votre cas particulier, l'étape du projet devrait ressembler à ceci:
aggregate.project({
_id: 1,
last: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$date', '$$REMOVE' ] },
user: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$user', '$$REMOVE' ] },
app: { $cond: [ { $eq : [ '$_id', 'undo' ] }, '$app', '$$REMOVE' ] }
});
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots