2013-05-06 52 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