mongodb 在数组中查找字段
mongodb find fields inside an array
我正在努力学习 mongodb,我的数据库如下所示:
{
"_id" : ObjectId("625c95836be34e3c73c37316"),
"cuisine" : "Chinese",
"grades" : [
{
"date" : ISODate("2014-02-25T00:00:00Z"),
"grade" : "A",
"score" : 112
},
{
"date" : ISODate("2013-08-14T00:00:00Z"),
"grade" : "C",
"score" : 28
},
{
"date" : ISODate("2012-07-18T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2012-03-09T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2011-10-27T00:00:00Z"),
"grade" : "A",
"score" : 12
},
{
"date" : ISODate("2011-05-19T00:00:00Z"),
"grade" : "A",
"score" : 13
}
],
"name" : "janette"
},
{
"_id" : ObjectId("625c95836be34e3c73c37317"),
"cuisine" : "Chinese",
"grades" : [
{
"date" : ISODate("2014-01-07T00:00:00Z"),
"grade" : "A",
"score" : 17
},
{
"date" : ISODate("2013-05-09T00:00:00Z"),
"grade" : "B",
"score" : 107
}
],
"name" : "Annie'S Kitchen"
}
每个对象都有一个拥有相同字段的数组。如果我尝试:
db.restaurants.find({"grades.score":{ $gt: 80, $lt: 100 }});
它会捕获两者,但应该捕获 none。
我也希望能够检查:
db.restaurants.find("grades.score":{$gt: 70},"grades.grade":{/^A$/} });
我只需要检查数组中相同位置的字段。
我不知道如何更好地解释它,抱歉,感谢您的帮助。
您可以使用$map
投影辅助布尔数组并使用$allElementsTrue
或$anyElementTrue
过滤它。
db.restaurants.aggregate([
{
"$match": {
$expr: {
"$allElementsTrue": {
"$map": {
"input": "$grades",
"as": "g",
"in": {
$and: [
{
$gt: [
"$$g.score",
80
]
},
{
$lt: [
"$$g.score",
100
]
}
]
}
}
}
}
}
}
])
这是 first and second query 的 Mongo 个游乐场。
我正在努力学习 mongodb,我的数据库如下所示:
{
"_id" : ObjectId("625c95836be34e3c73c37316"),
"cuisine" : "Chinese",
"grades" : [
{
"date" : ISODate("2014-02-25T00:00:00Z"),
"grade" : "A",
"score" : 112
},
{
"date" : ISODate("2013-08-14T00:00:00Z"),
"grade" : "C",
"score" : 28
},
{
"date" : ISODate("2012-07-18T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2012-03-09T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2011-10-27T00:00:00Z"),
"grade" : "A",
"score" : 12
},
{
"date" : ISODate("2011-05-19T00:00:00Z"),
"grade" : "A",
"score" : 13
}
],
"name" : "janette"
},
{
"_id" : ObjectId("625c95836be34e3c73c37317"),
"cuisine" : "Chinese",
"grades" : [
{
"date" : ISODate("2014-01-07T00:00:00Z"),
"grade" : "A",
"score" : 17
},
{
"date" : ISODate("2013-05-09T00:00:00Z"),
"grade" : "B",
"score" : 107
}
],
"name" : "Annie'S Kitchen"
}
每个对象都有一个拥有相同字段的数组。如果我尝试:
db.restaurants.find({"grades.score":{ $gt: 80, $lt: 100 }});
它会捕获两者,但应该捕获 none。 我也希望能够检查:
db.restaurants.find("grades.score":{$gt: 70},"grades.grade":{/^A$/} });
我只需要检查数组中相同位置的字段。
我不知道如何更好地解释它,抱歉,感谢您的帮助。
您可以使用$map
投影辅助布尔数组并使用$allElementsTrue
或$anyElementTrue
过滤它。
db.restaurants.aggregate([
{
"$match": {
$expr: {
"$allElementsTrue": {
"$map": {
"input": "$grades",
"as": "g",
"in": {
$and: [
{
$gt: [
"$$g.score",
80
]
},
{
$lt: [
"$$g.score",
100
]
}
]
}
}
}
}
}
}
])
这是 first and second query 的 Mongo 个游乐场。