如何在MongoDB中获取嵌套值?

时间:2018-07-31 03:51:23

标签: json mongodb

我有一个3层的嵌套文档,像这样。

{
"_id" : ObjectId("5b5acaf0589ff6bfb5dd091f"),
"date" : "2018/07/31",
"clock" : [ 
    {
        "time" : "10:12:02",
        "values" : [ 
            {
                "name" : "A1003",
                "value" : "777"
            }, 
            {
                "name" : "A0001",
                "value" : "888"
            }
        ]
    }, 
    {
        "time" : "13:12:02",
        "values" : [ 
            {
                "name" : "A1003",
                "value" : "111"
            }
        ]
    }
]
}

我可以通过使用$gte $lte如下对日期进行排序,并提取所有值。

getData(name: string[], fromDate: string, toDate: string): Promise<{ message: string }> {
    return this._mongoUtility.testDb
        .then(db => {
            let collection = db.collection('TestDoc');
            let fromOnlyDate = fromDate.split(' ');
            let toOnlyDate = toDate.split(' ');
            return collection.find({
                'date': {
                    $gte: `${fromOnlyDate[0]}`,
                    $lte: `${toOnlyDate[1]}`
                }
            }).toArray();
        })
        .catch(err => {
            return Promise.reject({message: 'Data not found', err: err})
        })
}

我想使用time进行过滤,然后再次使用name进行过滤,并且应该显示value

我尝试了很多方法,但是得到了结果。 MongoDB中还有其他方法可以这样做吗?请提出。

预期的输出应如下所示

0:{date: "2018/07/31 10:12:02", value-A1003: "777", value-A0001: "888"}
1:{date: "2018/07/31 13:12:02", value-A1003: "111"}

1 个答案:

答案 0 :(得分:0)

您可以使用汇总框架来获得简单的结果(您不能通过值创建attr)

db.getCollection('sss').aggregate([

    {$unwind:'$clock'},
    {$unwind:'$clock.values'},
    {$project:{
         date: {$concat:[  "$date" ,' ' ,  "$clock.time" ]},
         value:'$clock.values.value',
         name:'$clock.values.name'
     }}

])