我有一个这样的文件:
{
_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查询?
感谢您的帮助。
答案 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}
。