我使用Meteor在Mongo中有一组具有以下结构的文档:
{
...
Name: 'Jane Doe',
Finances: {
Owed: 0,
Due: 0,
Paid: [
[400, 'Oct 2015'],
[300, 'Jan 2016'],
[500, 'Mar 2016']
]
},
Address: '123 Mains Street',
...
}
我希望返回2016年支付价值的所有文件。因此,在此示例中,确实会返回上面的文档,因为它至少有一个子数组[,&#39 ; 2016年1月']在'付费'属性。我怎样才能在Mongo中设置查询?
我尝试过类似的事情:
Collection.find({ 'Finances.Paid[0]': { $regex: '2016' } });
但是我需要通过“付费”内的所有内部阵列。去检查。我可以在Mongo中严格执行此操作吗?
答案 0 :(得分:2)
这种架构设计很难。
Mongo不是为了查询而设计的,这是一个列表,用于存储存储不同类型值的列表,即[400,'2015年10月']。
更好的方法是查询设计Finances
字段,如下所示:
Finances: [
{ 'a': 400, 'b': 'Oct 2015'},
{ 'a': 300, 'b': 'Oct 2016'},
{ 'a': 500, 'b': 'Oct 2016'}
]
您可以执行以下查询:
db.Collection.find({ "Finances.Paid.b": { $regex:'2016'}})
使用您的架构,您可以通过聚合来实现:
db.Collection.aggregate([
{
$unwind: '$Finances.Paid'},
{
$match: {'Finances.Paid':{ $regex: '2016' }}
},
{
$group: {
_id:'$_id',
Name: {'$first': '$Name'},
Address: {'$first': '$Address'},
Finances: {'$first': '$Finances'}
}
},
]);
查询结果:
{
"_id" : ObjectId("580fb7d6c37ebe91b0f943df"),
"Name" : "Jane Doe",
"Address" : "123 Mains Street",
"Finances" : {
"Owed" : 0,
"Due" : 0,
"Paid" : [
300,
"Jan 2016"
]
}
}
将返回2016年支付价值的所有文件,缺点是从2016年开始只返回一笔付款,这是它创建的第一笔付款。
答案 1 :(得分:0)
我没有尝试使用您的数据代码,但您应该可以使用这样的代码
Collection.find({ Finances: {$elemMatch: {Paid: {$regex:'2016'}}}})
它应该扫描付费元素数组
编辑: 试试这个
Collection.find({ "Finances.Paid": {$elemMatch: { $regex:'2016'}}})
有关$ elemMatch
的说明,请参阅https://docs.mongodb.com/v3.2/reference/operator/query/elemMatch/