首页 > 解决方案 > MongoDB - 转换数组字段以设置

问题描述

我有一个包含可以复制的值数组的字段的文档。我想使用与该数组的唯一值相对应的额外字段来转换这些文档。我尝试了聚合 + addToSet 没有成功。

数据:

{..., "random_integers" : [1, 1, 2, 2, 3, 3]},
{..., "random_integers" : [2, 3, 4, 4, 5, 6]},
{..., "random_integers" : [9, 9, 8, 8, 7, 7]}

期待:

{
    ...
    "random_integers" : [1, 1, 2, 2, 3, 3],
    "unique_integers" : [1, 2, 3],
},
{
    ...
    "random_integers" : [2, 3, 4, 4, 5, 6],
    "unique_integers" : [2, 3, 4, 5, 6],

},
{
     ...
    "random_integers" : [9, 9, 8, 8, 7, 7],
    "unique_integers" : [7, 8, 9],
}

尝试使用聚合 + addToSet():

# Query
db.getCollection().aggregate([
    {
        $group: {
            _id: '$_id',
            unique_integers: {$addToSet: '$random_integers' }
        }
    }
])

# Results
{..., "unique_integers" : [[1, 1, 2, 2, 3, 3]]},
{..., "unique_integers" : [[2, 3, 4, 4, 5, 6]]},
{..., "unique_integers" : [[9, 9, 8, 8, 7, 7]]}

$addToSet 将整个列表添加到一个集合中,而不是数组的每个元素。我尝试将 $addToSet 与 $each 结合使用,但 mongo 在一个组中无法识别它:

# Query
db.getCollection().aggregate([
    {
        $group: {
            _id: '$_id',
            unique_integers: {$addToSet: { $each: '$random_integers' }}
        }
    }
])

# Error
Error: command failed: {
    "ok" : 0,
    "errmsg" : "Unrecognized expression '$each'",
    "code" : 168,
    "codeName" : "InvalidPipelineOperator"
} : aggregate failed 

标签: mongodbaggregate

解决方案


db.ints.aggregate( [
  { $project: { 
        random_integers: 1,
        unique_integers: { $setIntersection: [ "$random_integers", "$random_integers" ] },  
       _id: 0 
  } }
] )

推荐阅读