如何通过 mongodb 查询中的数值查找数组的 object 属性(string)?
How to find array's object property(string) by its numeric value in mongodb query?
我有一家 餐厅 collection,其文件格式如下:
{
"address": {
"building": "1007",
"coord": [
-73.856077,
40.848447
],
"street": "Moris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{
"date": {
"$date": 1393804800000
},
"grade": "A",
"score": "81"
},
{
"date": {
"$date": 1378857600000
},
"grade": "A",
"score": "6"
},
{
"date": {
"$date": 1358985600000
},
"grade": "A",
"score": "99"
},
{
"date": {
"$date": 11322006400000
},
"grade": "B",
"score": "14"
},
{
"date": {
"$date": 1288715200000
},
"grade": "B",
"score": "14"
}
],
"name": "Morris Park Bake Shop"
}
我的家庭作业要求我找到 得分从 80 到 100 的任何餐馆,我这样做了
db.restaurants.find({ $expr: {$and: [{$gt: [ { $toInt: "$grades.score" }, 80 ]}, {$lt: [ { $toInt: "$grades.score" }, 100 ]}] } }).pretty()
并收到“查找命令期间的执行器错误 :: 由 :: 在 $convert 中不支持从数组到 int 的转换引起,没有 onError 值”。
我试试
db.restaurants.find({ $expr: {$and: [{$gt: [ { $toInt: "$grades.$score" }, 80 ]}, {$lt: [ { $toInt: "$grades.$score" }, 100 ]}] } }).pretty()
并且此 returned:“FieldPath 字段名称不能以“$”开头。考虑使用 $getField 或 $setField。”
那我试试
db.restaurants.find({$and:[{'grades.score': {$gt: 80}}, {'grade.score':{$lt:100}}]}).collation({locale:'en_US' ,numericOrdering: true})
那 return 什么也没做。它必须 return 至少是我上面提到的文件,对吗?
也许这个作业是关于学习正确的字段值类型或排序规则。通过整理,numericOrdering
可以像@prasad_ 评论的那样使用。如果 score
确实是数字,出于多种原因,最好将其存储为数字。
不幸的是,目前似乎没有办法用 mongoplayground.net
指定排序规则。在不使用排序规则的情况下,有很多方法可以实现您想要的输出。这是一种方法。
db.collection.aggregate([
{
// make grades.score numeric
"$set": {
"grades": {
"$map": {
"input": "$grades",
"as": "grade",
"in": {
"$mergeObjects": [
"$$grade",
{ "score": { "$toDecimal": "$$grade.score" } }
]
}
}
}
}
},
{
"$match": {
"grades.score": {
"$gt": 80,
"$lt": 100
}
}
},
{
"$project": {
"_id": 0,
"name": 1
}
}
])
在 mongoplayground.net 上试用。
我有一家 餐厅 collection,其文件格式如下:
{
"address": {
"building": "1007",
"coord": [
-73.856077,
40.848447
],
"street": "Moris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{
"date": {
"$date": 1393804800000
},
"grade": "A",
"score": "81"
},
{
"date": {
"$date": 1378857600000
},
"grade": "A",
"score": "6"
},
{
"date": {
"$date": 1358985600000
},
"grade": "A",
"score": "99"
},
{
"date": {
"$date": 11322006400000
},
"grade": "B",
"score": "14"
},
{
"date": {
"$date": 1288715200000
},
"grade": "B",
"score": "14"
}
],
"name": "Morris Park Bake Shop"
}
我的家庭作业要求我找到 得分从 80 到 100 的任何餐馆,我这样做了
db.restaurants.find({ $expr: {$and: [{$gt: [ { $toInt: "$grades.score" }, 80 ]}, {$lt: [ { $toInt: "$grades.score" }, 100 ]}] } }).pretty()
并收到“查找命令期间的执行器错误 :: 由 :: 在 $convert 中不支持从数组到 int 的转换引起,没有 onError 值”。 我试试
db.restaurants.find({ $expr: {$and: [{$gt: [ { $toInt: "$grades.$score" }, 80 ]}, {$lt: [ { $toInt: "$grades.$score" }, 100 ]}] } }).pretty()
并且此 returned:“FieldPath 字段名称不能以“$”开头。考虑使用 $getField 或 $setField。” 那我试试
db.restaurants.find({$and:[{'grades.score': {$gt: 80}}, {'grade.score':{$lt:100}}]}).collation({locale:'en_US' ,numericOrdering: true})
那 return 什么也没做。它必须 return 至少是我上面提到的文件,对吗?
也许这个作业是关于学习正确的字段值类型或排序规则。通过整理,numericOrdering
可以像@prasad_ 评论的那样使用。如果 score
确实是数字,出于多种原因,最好将其存储为数字。
不幸的是,目前似乎没有办法用 mongoplayground.net
指定排序规则。在不使用排序规则的情况下,有很多方法可以实现您想要的输出。这是一种方法。
db.collection.aggregate([
{
// make grades.score numeric
"$set": {
"grades": {
"$map": {
"input": "$grades",
"as": "grade",
"in": {
"$mergeObjects": [
"$$grade",
{ "score": { "$toDecimal": "$$grade.score" } }
]
}
}
}
}
},
{
"$match": {
"grades.score": {
"$gt": 80,
"$lt": 100
}
}
},
{
"$project": {
"_id": 0,
"name": 1
}
}
])
在 mongoplayground.net 上试用。