2011-08-21 36 views
0

是標題很拗口,但它我可以簡潔地描述這個問題最簡單的辦法:在mongodb中如何選擇具有一個嵌入文檔但不是另一個的文檔?

我有一個文件,看起來像這樣:

{ "_id" : ObjectId("4e5044ecf9d7954533000002"), "events" : [ 
     { 
       "state" : 1, 
       "time" : 1313882989, 
     }, 
     { 
       "time" : 1313883005, 
       "state" : 0, 
     } 
]} 

你可以看到,「事件」是嵌入式文檔陣列。狀態:1表示該文檔當時被設置爲「活動」(UTC爲秒),而狀態:0表示當時被設置爲「非活動」。這基本上給我當這個文件是有效(從1313882989到1313883005)

現在我試着去確定哪些文件是活躍在任何特定時間,如在1313883013,該活動和非活動之間落在時間的時間範圍事件。

我能得到這個查詢的內容:

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}}}}) 

它匹配一個完整的嵌入式文件,其中狀態= 1和時間< 1313883013.這是不夠而是因爲我需要確保文檔還不含無效事件在或1313883013.之前,所以我已經試過這樣:

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}},$not:{$elemMatch:{state:0,time:{$lte:1313883013}}}}}) 

,但無濟於事。我也嘗試過不同的變化。

我希望我已經明確了這一點,提前感謝任何幫助!

+0

事件是否可以有多個0/1轉換?或者你是說它是[],[1]或[1,0]作爲狀態允許的唯一三個選項? –

+0

狀態基本上是一個「位標誌」0或1,沒有其他選項。 – talentedmrjones

回答

0

一個簡單的方法是定義將來無限遠的時間,並將任何活動文檔設置爲其結束時間。如果您將每個事件轉換爲{start:12345, end:999999999}的形式,那麼您的查詢就是start < time < end的簡單測試。當文檔不再被使用時,您可以簡單地查找具有最大結束時間的事件,並將該時間更改爲當前時間(簡單更新)。

+0

你是說你的根文檔有開始和結束鍵嗎?或每個嵌入式文件? (以防萬一,但嵌入的文檔要顯示動作的歷史記錄,所以我需要保留這些動作) – talentedmrjones

相關問題