以下是我正在使用的内容:
{
"_id": ObjectId("53b4402ae1382335c95952d3"),
"created": ISODate("2014-07-02T10:23:54.245Z"),
"modified": ISODate("2011-11-28T10:06:25.186Z"),
"source": [{
"instances": [{
"analyst": "harry",
"date": ISODate("2014-07-02T10:23:54.242Z"),
"reference": "abb32"
},
{
"analyst": "david",
"date": ISODate("2014-07-02T10:33:02.296Z"),
"reference": "can26"
}],
"name": "Apples"
},
{
"instances": [{
"analyst": "critsAPI",
"date": ISODate("2011-11-28T10:06:25.156Z"),
"reference": "z561c"
}],
"name": "Oranges"
}],
"releasability": [],
}
我想要的是统计每个文档的"实例日期"在某个范围内(比如一个月)以及某个名称。我使用了两个带有"elemMatch"的查询,不幸的是,我没有得到预期的结果。以下是我使用elematch和instances.date:尝试的内容
collection.find(
{
'source':
{
'$elemMatch' : {
'name':'Apples',
'instances.date' : {'$lte' : ISODate("2014-07-30T00:00:00Z") ,
'$gte' : ISODate("2014-07-01T00:00:00Z")}
}
}
}
).count()
这是一个嵌套的elemMatch:
collection.find(
{
'source':
{
'$elemMatch' : {
'name':'Apples',
'instances': {
'$elemMatch' : {
'date' : {'$lte' : ISODate("2014-07-30T00:00:00Z") ,
'$gte' : ISODate("2014-07-01T00:00:00Z")}
}
}
}
}
}
).count()
提前谢谢。
我的想法是使用点表示法来访问数组的元素,并结合$和运算符来查询"instances date"范围。
collection.find({
'source' : {
$elemMatch:{
'name': 'Apples',
$and:[ {'instances.date' : {$lte : ISODate("2014-07-30T00:00:00Z")}} ,
{'instances.date' : {$gte : ISODate("2014-07-01T00:00:00Z")}}]
}
}})
希望得到帮助:)
我猜您得到的count()
为1,因为count()
方法返回的是文档数,而不是数组元素数。
要获得2的结果(基于上述文档),您需要使用聚合框架。
请尝试以下操作:
db.coll1.aggregate([{$unvent:"$source"},{$unvent:"$source.instances"},{$match:{$和:[{"source.name":"Apples"},{"source.instances.date":{"$lte":ISODate("2014-07-30T00:00Z")}},{"source.instances.date":{"$gte":ISODate("2014-07-01T00:00Z")}]}},{$项目:{name1:"$source.name",date1:"$source.instances.date"}},{$group:{_id:"$name1",name1:{$sum:1}}])我在壳里得到了以下内容
{ "result" : [ { "_id" : "Apples", "name1" : 2 } ], "ok" : 1 }
$unwind
将数组分解为单独的文档,$match
进行选择,$project
定义结果字段(类似于SQL中的SELECT
子句),$group
对条目求和(类似于SQL中的"GROUP BY")
聚合管道中的这些单独步骤按顺序过滤/转换文档的结果集。
希望对有所帮助