使用变量嵌套字段名称

时间:2018-05-31 16:05:48

标签: json mongodb

我有一个MongoDB,其结构如下:

[
    {
        "subject_id": "1",
        "name": "Maria",
        "dob": "1/1/00",
        "gender": "F",
        "visits": {
            "1/1/18": {
                "date_entered": "1/2/18",
                "entered_by": "Sally"
            },
            "1/2/18": {
                "date_entered": "1/2/18",
                "entered_by": "Tim",
            }
        },
        "samples": {
            "XXX123": {
                "collected_by": "Sally",
                "collection_date": "1/3/18"
            }
        }
    },
    {
        "subject_id": "2",
        "name": "Bob",
        "dob": "1/2/00",
        "gender": "M",
        "visits": {
            "1/3/18": {
                "date_entered": "1/4/18",
                "entered_by": "Tim"
            }
        },
        "samples": {
            "YYY456": {
                "collected_by": "Sally",
                "collection_date": "1/5/18"
            },
            "ZZZ789": {
                "collected_by": "Tim",
                "collection_date": "1/6/18"
            },
            "AAA123": {
                "collected_by": "Sally",
                "collection_date": "1/7/18"
            }
        }
    }
]

如果我想查询数据库以查找Sally收集的所有样本或Tim输入的所有访问,那么最好的方法是什么?

我是MongoDB的新手,我尝试使用各种正则表达式并未产生结果。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我首先在必填字段上使用project使用objectToArray后跟unwindproject中创建的数组创建单独的记录。

然后使用match过滤结果。

这适用于问题中提供的数据 -

db.so.aggregate([
    {$project: {visits: {$objectToArray: "$visits"}, samples: {$objectToArray: "$samples"}}},
    {$unwind: "$visits"},
    {$unwind: "$samples"},
    { $match: { 
            $or : [
                { "visits.v.entered_by" : "Tim" },
                { "samples.v.collected_by" : "Sally" }
            ]
        }
    }
])