【发布时间】:2016-04-06 06:55:00
【问题描述】:
我是 MongoDB 的新手,我正在做一些练习。特别是我被困在this exercise 上,我在这里报告了这个问题:
给定文档“Restaurant”的以下结构:
{
"_id" : ObjectId("5704adbc2eb7ebe23f582818"),
"address" : {
"building" : "1007",
"coord" : [
-73.856077,
40.848447
],
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"borough" : "Bronx",
"cuisine" : "Bakery",
"grades" : [
{
"date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A",
"score" : 2
},
{
"date" : ISODate("2013-09-11T00:00:00Z"),
"grade" : "A",
"score" : 6
},
{
"date" : ISODate("2013-01-24T00:00:00Z"),
"grade" : "A",
"score" : 10
},
{
"date" : ISODate("2011-11-23T00:00:00Z"),
"grade" : "A",
"score" : 9
},
{
"date" : ISODate("2011-03-10T00:00:00Z"),
"grade" : "B",
"score" : 14
}
],
"name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445"
}
编写一个 MongoDB 查询来查找餐厅 ID、名称和等级,这些餐厅的等级数组的第二个元素包含等级“A”并且在 ISODate“2014-08-11T00:00:00Z”上得分为 9。
我写了这个查询:
db.restaurants.find(
{
'grades.1': {
'score': 'A',
'grade': 9,
'date' : ISODate("2014-08-11T00:00:00Z")
}
},
{
restaurant_id: 1,
name: 1,
grades: 1
});
这不起作用。 提供的解决方案如下:
db.restaurants.find(
{ "grades.1.date": ISODate("2014-08-11T00:00:00Z"),
"grades.1.grade":"A" ,
"grades.1.score" : 9
},
{"restaurant_id" : 1,"name":1,"grades":1}
);
我的问题是:
- 有没有办法编写查询避免重复
grades.1部分? - 既然
grades.1是一个文档对象,为什么我的查询有误?
如果它可以帮助回答我的问题,我正在使用MongoDB shell version: 3.2.4
编辑:
感谢this question,我找到了问题 2 的答案。
我特别发现顺序很重要。事实上,如果我执行以下查询,我会得到一个有效的结果:
db.restaurants.find({'grades.1': {'date': ISODate("2014-08-11T00:00:00Z"), 'grade':'A', score:9}}, {restaurant_id:1, name:1, grades:1})
请注意,此查询之所以有效,是因为指定了所有子文档的“字段”,并且它们以相同的顺序指定。
【问题讨论】:
-
这不是一个有效的文档,因为字段名不能以
$开头 -
没错,他们提供了错误的结构。我用真实的纠正了它
-
您也应该使用有效的
date,因为它出现在您的查询条件中。 -
@user3100115 我现在粘贴了
db.restaurants.find().limit(1)的结果,所以你有一个有效且格式正确的文档
标签: javascript mongodb mongodb-query aggregation-framework