我正在尝试在数组(“可用性”)中进行查询(在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)
}
]
}
有人可以帮助我吗?
...谢谢
答案 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"
}
}
})