2013-05-06 47 views
1

我有一个像下面的文档。 periods字段定义用户有权访问某些数据的时段。如何查询嵌入式数组中的两个字段?

{ 
    "_id":ObjectId("51878ecc0e9528429ab6e7cf"), 
    "name" : "Peter Flack", 
    "periods":[ 
     { 
     "from":1, 
     "to":2 
     }, 
     { 
     "from":4, 
     "to":6 
     }, 
     { 
     "from":10, 
     "to":12 
     } 
    ] 
} 

现在我想,以确定是否在任意时段内是任何在period领域的时段。我曾尝试以下:

db.subs.find({"periods.from" : {$gte : 1}, "periods.to" : {$lte : 12}, "periods.from" : {$lte : 12}, "periods.to" : {$gte : 1}}) 

该查询返回该文件,因为不存在与from> = 1阵列中的一个元件,并与to < = 12

但是antoher元件,我想取回文件仅当fromto同一元素符合标准。

我将如何编写查询来实现这一目标?

回答

4

你必须使用$ elemMatch:在阵列中的每个元素elemMatch匹配的PARAMS。

Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 1, $lte:12}, to : {$gte : 1, $lte : 12} }}}).pretty() 
{ 
    "_id" : ObjectId("51878ecc0e9528429ab6e7cf"), 
    "name" : "Peter Flack", 
    "periods" : [ 
     { 
      "from" : 1, 
      "to" : 2 
     }, 
     { 
      "from" : 4, 
      "to" : 6 
     }, 
     { 
      "from" : 10, 
      "to" : 12 
     } 
    ] 
} 
Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 2, $lte : 4}, to : {$gte : 10, $lte : 12} }}}).pretty() 
no result 
+0

对不起,没有工作。据我了解,$ elemMatch是用于投影。也就是说,它只影响文档中要返回的字段,而不影响文档是否应返回。查看文档,它只用于find()函数的第二个参数。 – luttkens 2013-05-06 11:58:33

+0

@luttkens'$ elemMatch'也是一个查询操作符。 Docs [here](http://docs.mongodb.org/manual/reference/operator/elemMatch/#op._S_elemMatch)。当你写查询的时候它工作的很好,我想你已经把你的'$ gte'和'$ lte'运算符换成了你真正想要的东西。 – JohnnyHK 2013-05-06 12:21:12

+0

@luttkens:$ elemMatch将工作。 我已经修改了我以前的评论,请检查 – 2013-05-06 12:40:08