mongodb只显示列表中的特定值

时间:2015-12-17 08:19:24

标签: python regex mongodb

我有一个日期列表,我正在$regex找到这些值,但我想只显示查询的值。

存储在集合中的数据:

{
    "Pid" : "5652f92761be0b14889d9854",
    "Registration" : "TN 56 HD 6766",
    "Booked" : [
            "1-10-2015",
            "6-10-2015",
            "11-12-2015",
            "16-12-2015",
            "10-12-2015"
    ],
    "Vid" : "56543ed261be0b0a60a896c9"
}

我像这样进行搜索

db.calendar2.find({"Pid" : "5652f92761be0b14889d9854","Registration" : "TN 56 HD 6766","Booked" : {"$regex": "10-2015"}})

来自我的python程序。

我得到的输出。

{
    "Pid" : "5652f92761be0b14889d9854",
    "Registration" : "TN 56 HD 6766",
    "Booked" : [
            "1-10-2015",
            "6-10-2015",
            "11-12-2015",
            "16-12-2015",
            "10-12-2015"
    ],
    "Vid" : "56543ed261be0b0a60a896c9"
}

期望的输出

{
    "Pid" : "5652f92761be0b14889d9854",
    "Registration" : "TN 56 HD 6766",
    "Booked" : [
            "1-10-2015",
            "6-10-2015"
    ],
    "Vid" : "56543ed261be0b0a60a896c9"
}

任何人都可以指导我

修改  我已经尝试过,但我没有得到输出,我只想要显示匹配正则表达式条件的特定日期集

2 个答案:

答案 0 :(得分:1)

以下是使用聚合框架实现所需目标的一种方法:

- 取消预订数组

- 匹配您想要的文档(以及已展开的数组元素)

- 通过过滤器将结果组合在一起,并将未展开的数组元素推回Booked

- 投射结果以解压缩组对象中的值

db.calendar2.aggregate([{
    $unwind: "$Booked"
}, {
    $match: {
        "Pid": "5652f92761be0b14889d9854",
        "Registration": "TN 56 HD 6766",
        "Vid": "56543ed261be0b0a60a896c9",
        "Booked": /10-2015/
    }
}, {
    $group: {
        _id: {
            Pid: "$Pid",
            Registration: "$Registration",
            Vid: "$Vid"
        },
        Booked: {
            $push: "$Booked"
        }
    }
}, {
    $project: {
        Pid: "$_id.Pid",
        Registration: "$_id.Registration",
        Vid: "$_id.Vid",
        Booked: 1,
        _id: 0
    }
}]);

答案 1 :(得分:0)

当您在MongoDB中找到具有特定条件的文档时。查找返回此文档。但你可以“投射”只获得某些领域。它是find method的第二个参数。

我认为在这种情况下你可以这样做:

db.calendar2.find({"Pid" : "5652f92761be0b14889d9854","Registration" : "TN 56 HD 6766","Booked" : /10-2015/ }, {"Booked.$": /10-2015/ } )

使用$ operator和//而不是$ regex(相同)。

它的工作原理是什么?