我正在使用以下文档结构的mongo DB集合,
名:详细信息:日期:值
所以,对于单个名称,我们将有一个详细信息列表,
该详细信息列表将包含多个日期列表
每个日期列表都有多个值列表
{
"_id" : ObjectId("51472e9fd29a736d83c27ca3"),
"name" : "Arun",
"details" : [
{
"date" : "2015-01-17",
"isNew" : false,
"isOld" : true,
"values" : [
{
"money" : "330.0",
"new" : false,
"old" : true,
},
{
"money" : "340.0",
"new" : false,
"old" : true,
}
]
},
{
"date" : "2015-01-17",
"isNew" : false,
"isOld" : false,
"values" : [
{
"money" : "330.0",
"new" : false,
"old" : false,
},
{
"money" : "340.0",
"new" : false,
"old" : false,
}
]
},
{
"date" : "2015-01-17",
"isNew" : true,
"isOld" : false,
"values" : [
{
"money" : "330.0",
"new" : true,
"old" : false,
},
{
"money" : "340.0",
"new" : true,
"old" : false,
}
]
},
{
"date" : "2013-10-19",
"isNew" : true,
"isOld" : false,
"values" : [
{
"money" : "330.0",
"new" : true,
"old" : false,
},
{
"money" : "340.0",
"new" : true,
"old" : false,
}
]
}
]
}
What is need is, i want to SELECT "all the date lists" where "name" : "Arun" and "date" : "2015-01-17",I tried this way and it is not working as expected.I am getting all the dates instead 2015-01-17 in return.
I think only one where condition is working here and that is "name" : "Arun" , Query is not considering "details.date" : "2015-01-17" in where condition.
db.student.find({ "details.date" : "2015-01-17","name" : "Arun" },{"details.date":1}).pretty()
{
"_id" : ObjectId("51472e9fd29a736d83c27ca3"),
"details" : [
{
"date" : "2015-01-17"
},
{
"date" : "2015-01-17"
},
{
"date" : "2015-01-17"
},
{
"date" : "2013-10-19"
}
]
}
我目前正在使用mongo 1.6.5
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
首先,您需要升级到当前版本的MongoDB。 1.6现在是目前“主要”版本的三个版本。
其次,您需要修复架构。你说“对于一个名称,我们将有一个详细信息列表” - 如果你继续在这个列表/数组中添加内容,它将继续无限增长,这是一个糟糕的模式设计。另外,将要与文档一起获取的数组值分组更为正确 - 在这种情况下,您特别不希望获取文档的所有值,您只想获取特定元素的元素date,加上isOld / isNew字段向我建议,其中一些条目将对应于过时的值,而其他条目将是最新的,并且将它们组合到同一文档中是一个坏主意。
所以我的建议是将你的结构改为每个学生的多个文件:
{
"name" : "Arun",
"date" : "2015-01-17",
"isNew" : false,
"isOld" : true,
"values" : [
{
"money" : "330.0",
"new" : false,
"old" : true,
},
{
"money" : "340.0",
"new" : false,
"old" : true,
}
]
},
{
"name" : "Arun",
"date" : "2015-01-17",
"isNew" : false,
"isOld" : true,
"values" : [
{
"money" : "330.0",
"new" : false,
"old" : false,
},
{
"money" : "340.0",
"new" : false,
"old" : false,
}
]
},
{
"name" : "Arun",
"date" : "2015-01-17",
"isNew" : false,
"isOld" : true,
"values" : [
{
"money" : "330.0",
"new" : true,
"old" : false,
},
{
"money" : "340.0",
"new" : true,
"old" : false,
}
]
},
{ "name" : "Arun",
"date" : "2013-10-19",
"isNew" : true,
"isOld" : false,
"values" : [
{
"money" : "330.0",
"new" : true,
"old" : false,
},
{
"money" : "340.0",
"new" : true,
"old" : false,
}
]
}
]
}
现在查询各种属性会更加直接,包括能够在值和外部字段中查询。
答案 1 :(得分:0)
您的查询实际上是匹配这两个字段。输出是MongoDB处理数组的副产品。匹配
"details.date" : "2015-01-17"
将返回集合中的任何文档,其中details
字段中的任何条目都具有正确的日期。它不会只返回details数组中的各个条目。
为此,您可能需要查看$elemMatch运算符以进行投影,以限制返回的数组中的条目。
答案 2 :(得分:0)
这是您的查询,
db.sandy.aggregate(
{$unwind : "$details"},
{$match : {"details.date" : "2015-01-17","name" : "Arun"}}
)
我认为mongo 1.6.5不支持聚合。参考Doc一次。