如何在mongodb中返回数组中具有特定值的所有文档

时间:2016-10-25 19:47:08

标签: mongodb meteor

我使用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中严格执行此操作吗?

2 个答案:

答案 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/