【问题标题】:How to return all documents that have a certain value in an array in mongodb如何在mongodb的数组中返回所有具有特定值的文档
【发布时间】:2016-10-26 05:33:21
【问题描述】:

我在 Mongo 中使用 Meteor 收集了具有以下结构的文档:

 {
 ...
 Name: 'Jane Doe',
 Finances: { 
   Owed: 0, 
   Due: 0, 
   Paid: [
     [400, 'Oct 2015'], 
     [300, 'Jan 2016'], 
     [500, 'Mar 2016']
   ]
 },
 Address: '123 Mains Street',
 ...
 }

我想返回所有具有 2016 年付款值的文档。因此,在此示例中,确实会返回上面的文档,因为它至少有一个子数组 [, 'Jan 2016']在“付费”属性中。如何在 Mongo 中设置查询?

我尝试了类似的方法:

Collection.find({ 'Finances.Paid[0]': { $regex: '2016' } });

但我需要通过“付费”中的所有内部数组进行检查。我可以在 Mongo 中严格执行此操作吗?

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    这种架构设计很困难。

    Mongo 的设计目的不是很好地查询,它是一个存储不同类型值的列表的列表,即 [400, 'Oct 2015']。 更好的是查询来设计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 年的一笔付款,即它找到的第一笔付款。

    【讨论】:

    • 谢谢。我正在将我的架构更改为类似于您的架构以使其正常工作。
    【解决方案2】:

    我没有用你的数据尝试过这段代码,但你应该可以用这样的东西来做

    Collection.find({ Finances: {$elemMatch: {Paid: {$regex:'2016'}}}})
    

    它应该扫描付费元素的数组

    编辑: 试试这个

    Collection.find({ "Finances.Paid": {$elemMatch: { $regex:'2016'}}})
    

    请参阅https://docs.mongodb.com/v3.2/reference/operator/query/elemMatch/ 了解 $elemMatch 的说明

    【讨论】:

    • 不走运。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2023-01-03
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2019-10-11
    • 2015-02-13
    相关资源
    最近更新 更多