Tenho um banco de dados cheio de documentos, cada um contendo uma coleção de transações:
[
{
"key": 1,
"data": [
{
"trans": 1,
"uid": 1
},
{
"trans": 2,
"uid": 1
}
]
},
{
"key": 2,
"data": [
{
"trans": 3,
"uid": 1
},
{
"trans": 4,
"uid": 2
}
]
}
]
Quero criar um novo campo em cada um dos documentos principais, que tenha os valores exclusivos do uid
campo. Posso chegar a um ponto em que isso acontece usando $map
:
db.collection.aggregate([
{
"$set": {
"uid": {
"$map": {
"input": "$data",
"as": "trans",
"in": "$$trans.uid"
}
}
}
}
])
Isso me dá:
[
{
"key": 1,
"uid": [1,1],
"data": [
{
"trans": 1,
"uid": 1
},
{
"trans": 2,
"uid": 1
}
]
},
{
"key": 2,
"uid": [1, 2],
"data": [
{
"trans": 3,
"uid": 1
},
{
"trans": 4,
"uid": 2
}
]
}
]
Isso está próximo, mas não consigo descobrir o último passo. Quero usar apenas os valores exclusivos, então o uid
para o primeiro documento deve ser [1]
, não [1, 1]
.
A distinct()
função funciona em coleções, não em documentos individuais.
Eu acho que isso $addToSet
funcionaria, mas não funciona em arrays, apenas na saída de $group
. Também tentei criar uma $reduce
especificação usando $setUnion
, mas não sei como promover meu valor numérico em um array.
Posso usar o $unwind
estágio com agrupamento _id
para obter os valores corretos para o novo campo, mas não consigo descobrir como anexá-los de volta aos objetos originais.
Você está muito próximo de
$setUnion
. Você não precisa usar$reduce
para iterar pelo array.Parque infantil Mongo