我有一个汽车模型,如下所示
{
"_id": "54b8a71843286774060b8bed",
"name": "Car1",
"active": true,
"model": [
{
"name": "Model1",
"active": true,
"_id": "54b8a71843286774060b8bee",
"available": [
{
"Day": "Mon",
"quantity": "6"
},
{
"Day": "Tue",
"quantity": "6"
},
{
"Day": "Wed",
"quantity": "6"
},
{
"Day": "Thurs",
"quantity": "6"
},
{
"Day": "Fri",
"quantity": "0"
}
]
},
{
"name": "Model2",
"active": true,
"_id": "54b8a71843286774060b8bef",
"available": [
{
"Day": "Mon",
"quantity": "6"
},
{
"Day": "Tue",
"quantity": "6"
},
{
"Day": "Wed",
"quantity": "6"
},
{
"Day": "Thurs",
"quantity": "6"
},
{
"Day": "Fri",
"quantity": "6"
}
]
},
{
"name": "Model3",
"active": true,
"_id": "54b8a71843286774060b8beg",
"available": [
{
"Day": "Mon",
"quantity": "6"
},
{
"Day": "Tue",
"quantity": "6"
},
{
"Day": "Wed",
"quantity": "6"
},
{
"Day": "Thurs",
"quantity": "6"
},
{
"Day": "Fri",
"quantity": "0"
}
]
}
]
}
我正在尝试搜索汽车在给定日期的可用性。例如,如果我选择星期五,那么它应该在星期五返回数量超过0的汽车,但目前它也返回数量为0的所有汽车。
我已经写了如下的问题
Car.find({ 'active':真,'model.available':{ $elemMatch:{$gte : 1 } )
但它也会返回数量为0的文档。
发布于 2015-01-20 22:34:18
为此,您需要aggregation pipeline。
下面的代码片段实现了这一点:
{name: "Car1": 1, models: [{name: "Model1"}, {name: "Model2"}, {name: "Model3"}]}
变成:
对拆分的文档(再次)按数量进行筛选,然后day.
{name: "Car1", models: {name: "Model1"}}
& {name: "Car1", models: {name: "Model2"}}
&{name: "Car1", models: {name: "Model2"}}
拆分文档。你可能不需要在你的application.中使用它
db.cars.aggregate([
// First, we do your query, which will return
// every document that has _at least one_
// model that is available.
{$match: {
'active': true,
'model.available': {$elemMatch: {
'quantity': {$gte: 1},
'Day': 'Fri'
}}
}},
// We split up the found documents,
// every document will now have exactly
// one 'model' in it.
{$unwind: "$model"},
// We now filter the split documents.
{$match: {
'model.available': {$elemMatch: {
'quantity': {$gte: 1},
'Day': 'Fri'
}}
}},
// If you want, you can now glue the
// models back together again.
{$group: {
_id: "$_id", // Group all documents with the same _id
name: {$first: "$name"},
active: {$first: "$active"},
model: {$push: "$model"} // Make an array of models
}}
])
重要提示:要使$gte
正常工作,您需要将数量存储为数字,而不是字符串。由于您的示例将数字存储为字符串,因此您可能需要在数据库中仔细检查它们。
https://stackoverflow.com/questions/28046335
复制相似问题