MongoDB多级嵌入式数组查询

时间:2019-08-25 20:18:10

标签: mongodb

我有一个这样的文件:

{
 _id: 1,
 data: [
        {
           _id: 2,
           rows: [
                  {
                   myFormat: [1,2,3,4]
                  },
                  {
                   myFormat: [1,1,1,1]
                  }
                 ]
        },
        {
           _id: 3,
           rows: [
                  {
                   myFormat: [1,2,7,8]
                  },
                  {
                   myFormat: [1,1,1,1]
                  }
                 ]
        }
       ]
},

我想获得不同的myFormat值作为一个完整的数组。

例如:我需要的结果为:[1,2,3,4], [1,1,1,1], [1,2,7,8]

如何为此编写mongoDB查询?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果行中的每个对象只有一个字段 myFormat

,请尝试此操作
db.getCollection('yourCollection').distinct('data.rows')

Ref:mongoDB Distinct Values for a field

或者如果您需要一个数组,并且行中的对象还有其他多个字段,请尝试以下操作:

db.yourCollection.aggregate([{$project :{'data.rows.myFormat':1}},{ $unwind: '$data' }, { $unwind: '$data.rows' },
{ $group: { _id: '$data.rows.myFormat' } },
{ $group: { _id: '', distinctValues: { $push: '$_id' } } },
{ $project: { distinctValues: 1, _id: 0 } }])

否则:

db.yourCollection.aggregate([{ $project: { values: '$data.rows.myFormat' } }, { $unwind: '$values' }, { $unwind: '$values' },
{ $group: { _id: '', distinctValues: { $addToSet: '$values' } } }, { $project: { distinctValues: 1, _id: 0 } }])

上面的聚合查询可以满足您的要求,但是对于大型数据集而言,这些查询可能很乏味,请尝试运行这些查询并检查是否存在速度慢,是否使用过一次,然后在需要时可以考虑使用{ {1}},无论是否使用一次,都需要检查是否使用{allowDiskUse: true}

Ref:allowDiskUse$unwind preserveNullAndEmptyArrays