2014-01-18 37 views
1

我有以下文件的MongoDB与elemMatch和日期字段不正确的结果

{ 
    "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), 
    "assignments" : [ 
     { 
      "project" : "abc", 
      "start" : ISODate("2012-12-31T18:30:00Z"), 
      "end" : ISODate("2013-06-29T18:30:00Z") 
     }, 
     { 
      "project" : "efg", 
      "start" : ISODate("2013-06-30T18:30:00Z"), 
      "end" : ISODate("2014-03-30T18:30:00Z") 
     } 
    ], 
    "eid" : "123", 
    "name" : "n1", 
    "uid" : "u1" 
} 

我试图找到一个特定的日期与下面的查询后启动的所有作业。但返回的数据很混乱,看起来不正确。 pl帮助我了解我做错了什么。

> db.test.find({uid:'u1'},{ assignments: { $elemMatch: {end: {$gte: new Date(2011,5,1) } } }}).pretty(); 
{ 
    "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), 
    "assignments" : [ 
     { 
      "project" : "abc", 
      "start" : ISODate("2012-12-31T18:30:00Z"), 
      "end" : ISODate("2013-06-29T18:30:00Z") 
     } 
    ] 
} 

它应该返回两个项目吗?

回答

0

使用该查询,您正在搜索具有uid = u1的文档,并预测结果以仅显示日期大于Date(2011,5,1)的第一个元素。检查$elemMatch projection operator

我想你需要的东西是这样的:

db.test.find( 
{ 
    uid:'u1' 
    "assignments.end": {$gte: new Date(2011,5,1)} 
}).pretty(); 
+0

我认为需要使用聚合框架工作和项目。将检查更多并更新线程 – user3209488

2

$elemMatch operator将结果限制为每个文件的第一个匹配的数组元素。

如果你想返回所有匹配的数组元素可以使用Aggregation Framework

db.courses.aggregate(
    // Find matching documents (would benefit from an index on `{uid: 1}`) 
    { $match : { 
     uid:'u1' 
    }}, 

    // Unpack the assignments array 
    { $unwind : "$assignments" }, 

    // Find the assignments ending after given date 
    { $match : { 
     "assignments.end": { $gte: ISODate("2011-05-01") } 
    }} 
) 
1

$elemMatch极限的预测以下列方式。 说你有这些文件的集合:

{ "_id" : 1, "prices" : [ 50, 60, 70 ] } 
{ "_id" : 2, "prices" : [ 80, 90, 100 ] } 
db.t.find({},{'prices':{$elemMatch:{$gt:50}}}) 

返回:

{ "_id" : 1, "prices" : [ 60 ] } 
{ "_id" : 2, "prices" : [ 80 ] } 

的投影被缩减到匹配,而不是匹配的所有元素的第一个元素。 如果你期待这样的结果:

{ "_id" : 1, "prices" : [ 60,70] } 
{ "_id" : 2, "prices" : [ 80, 90, 100 ] } 

这是不可能的,只支持$elemMatch$$slice预测。 例如,您可以在投影或任何其他智能投影中使用例如$ all。

如果您想要对文档进行造型,匹配,过滤,放样和放样(通过分组)。

aggregate([ {$unwind:'$prices'},{$match:{'prices':{$gt:50}}},{$group:{_id:'$_id',prices:{$push:'$prices'}}}]) 

这将导致我们正在寻找什么。

{ "_id" : 2, "prices" : [ 80, 90, 100 ] } 
{ "_id" : 1, "prices" : [ 60, 70 ] } 

你可以采取这种模式,并将其用于您的情况。