在数组中查询日期

时间:2015-07-25 03:50:51

标签: mongodb mongodb-query

我正在尝试在数组(“可用性”)中进行查询(在MongoDB中),它将返回一个唯一的酒店,其元素(“可用”)等于1,并且在可用性内的日期之间。

但是当正确的回报是“Mercato Hotel”时,查询将返回所有酒店

查询我使用过但没有成功:

{city: "Boston", availability: { $elemMatch: {availability: 1, date: {$gte: ISODate("2015-05-02T00:00:00.000+0000")}, date: {$lte: ISODate("2015-05-04T00:00:00.000+0000")}}}}

MongoDb中的Json:

 { 
        "_id" : ObjectId("55b302ee8debdf1a908cdc85"), 
        "city" : "Boston", 
        "hotel" : "Mercatto Hotel", 
        "availability" : [
            {
                "date" : ISODate("2015-05-01T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }, 
            {
                "date" : ISODate("2015-05-02T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }, 
            {
                "date" : ISODate("2015-05-03T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }, 
            {
                "date" : ISODate("2015-05-04T00:00:00.000+0000"), 
                "available" : NumberInt(1)
            }
        ]
    }
    { 
        "_id" : ObjectId("55b302ee8debdf1a908cdc89"), 
        "city" : "Boston", 
        "hotel" : "Hostel Villa", 
        "availability" : [
            {
                "date" : ISODate("2015-05-01T00:00:00.000+0000"), 
                "available" : NumberInt(1)
            }, 
            {
                "date" : ISODate("2015-05-02T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }, 
            {
                "date" : ISODate("2015-05-03T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }, 
            {
                "date: ISODate("2015-05-04T00:00:00.000+0000"), 
                "available" : NumberInt(0)
            }
        ]
    }

有人可以帮助我吗?

...谢谢

3 个答案:

答案 0 :(得分:3)

您的查询中有一个拼写错误,availability而不是available,应该是这样的:

{
    city: "Boston", 
    availability: {
            $elemMatch: {
                    available: 1, 
                    date: {
                        $gte: ISODate("2015-05-02T00:00:00.000+0000"), 
                        $lte: ISODate("2015-05-04T00:00:00.000+0000")
                    }
            }
    }
}

更新 Blakes Seven

如果您只想获得与您的查询匹配的availability数组元素,请添加投影:

{
    "city": 1,
    "hotel": 1
    "availability.$.date": 1
}

答案 1 :(得分:2)

查询:

{
    city: "Boston", 
    availability: {
            $elemMatch: {
                    available: 1, 
                    date: {
                        $gte: ISODate("2015-05-02T00:00:00.000+0000"), 
                        $lte: ISODate("2015-05-04T00:00:00.000+0000")
                    }
            }
    }
}

返回相同的结果。换句话说,当正确的回报是" Mercato Hotel"。

时,返回所有酒店

答案 2 :(得分:1)

您可以使用aggregation获得预期输出,如下所示:

db.collection.aggregate({
    $unwind: "$availability"
}, {
    $match: {
    "city": "Boston",
    "availability.available": 1,
    "availability.date": {
        $gte: ISODate("2015-05-02T00:00:00.000+0000"),
        $lte: ISODate("2015-05-04T00:00:00.000+0000")
    }
    }
})

修改

如果有多个available=1,请使用以下查询:

db.collection.aggregate({
    $unwind: "$availability"
}, {
    $match: {
    "city": "Boston",
    "availability.available": 1,
    "availability.date": {
        $gte: ISODate("2015-05-02T00:00:00.000+0000"),
        $lte: ISODate("2015-05-04T00:00:00.000+0000")
    }
    }
}, {
    $group: {
    _id: "$hotel",
    "city": {
        $first: "$city"
    },
    "availability": {
        $push: "$availability"
    }
    }
})