我有一个充满文档的数据库,每个文档都包含一组交易:
[
{
"key": 1,
"data": [
{
"trans": 1,
"uid": 1
},
{
"trans": 2,
"uid": 1
}
]
},
{
"key": 2,
"data": [
{
"trans": 3,
"uid": 1
},
{
"trans": 4,
"uid": 2
}
]
}
]
我想在每个主文档中创建一个新字段,该字段具有该uid
字段的唯一值。我可以使用以下方法实现部分功能$map
:
db.collection.aggregate([
{
"$set": {
"uid": {
"$map": {
"input": "$data",
"as": "trans",
"in": "$$trans.uid"
}
}
}
}
])
这给了我:
[
{
"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
}
]
}
]
这很接近,但我似乎无法弄清楚最后一步,我只想使用唯一值,所以uid
第一个文档的应该是[1]
,而不是[1, 1]
。
该distinct()
函数适用于整个集合,而不是单个文档。
我认为这样$addToSet
可行,但它不能对数组进行操作,只能对 的输出进行操作$group
。我还尝试$reduce
使用 创建规范$setUnion
,但我不知道如何将我的数值提升到数组中。
我可以使用$unwind
分组阶段_id
来获取新字段的正确值,但我不知道如何将它们附加回原始对象。
您已经非常接近了
$setUnion
。您不需要使用$reduce
来遍历数组。蒙戈游乐场