2012-07-19 64 views
11

我開發這一塊的節點和MongoDB軟件中,我主要想存儲結構如下包版本:如何處理MongoDB鍵名中的點?

{ 
    "versions": 
    { 
     "1.2.3": { stuff } 
    } 
} 

(類似於如何NPM做在沙發上的東西)

問題是,當我更新MongoDB時,我發現它不允許在關鍵名稱中出現點(由於點符號存在),導致我的代碼失敗。經過研究,我所能找到的是,在存儲到數據庫之前,需要將這些點轉換爲其他字符,然後在訪問時再將它們轉換回來。真的沒有更好的方法來處理這個問題嗎?

如果沒有,如何在不將數據複製到另一個密鑰並刪除原始數據的情況下執行此轉換?

+0

你是說你已經有Mongo的數據嗎?即使在更新之前,這應該是不可能的。你使用的是什麼版本? – Thilo 2012-07-19 01:25:18

+0

@Thilo我實際上並不記得,但它可能是驅動程序是越野車,並允許它。 – jli 2012-07-19 01:26:00

+0

@ c0deNinja它允許我通過版本名稱進行查找,而無需遍歷整個可能包含很多版本的數組。 – jli 2012-07-19 01:26:29

回答

2

點的限制,目前的驅動程序執行,並從一開始就不是所有的司機都防止字段名點。您可以編寫原始協議代碼來在Mongo中執行各種瘋狂的東西,包括在集合名稱中使用真正奇怪的字符。

如果你清理它,可能會好得多(可能用其他有效字符代替點),但用任何智能過濾​​都很難做到。您很可能需要遍歷整個集合,將應用程序中的值覆蓋,然後覆蓋文檔中的整個「版本」字段。由於他們不會調整文檔大小,因此可以覆蓋它,這應該是相當迅速的,並且可能不會更改任何索引。

+0

是的,這就是我想到的..這裏的一個問題是,這個應用程序的用戶可以添加任何字符串作爲一個版本,所以我沒有一個標準的工作。對於每一次讀取,執行這些操作的速度是否會比mongo與沙發等東西相比有所提高?由於該項目目前正處於早期開發階段,因此我可能只需切換數據庫。 – jli 2012-07-19 01:38:49

+0

其實這似乎會在測試時相對較快,謝謝。 – jli 2012-07-19 01:54:49

+0

您是否真的需要在文檔版本中進行查詢?實際上,你可以在「版本」中存儲一個json字符串,並在加載/查看時手動解析它。在讀取時對字符串進行處理可能不會讓你的速度變慢,Mon​​go的讀取速度比Couch快得多。 – MrKurt 2012-07-19 01:55:47

3

你可以使用與東西的版本集合?

像:

{ 
    "versions": 
    [ 
       { 
        "version_num": "1.2.3", 
        "stuff": { stuff } 
       }, 
       { 
        "version_num": "1.2.4", 
        "stuff": { stuff } 
       } 
    ] 
} 
+0

除了這是一個無效的對象, m試圖避免在這裏迭代一個數組。 – jli 2012-07-19 01:30:28

+0

是的,它是無效的,只是想知道一個數組是否會工作。 Okey – keaplogik 2012-07-19 01:36:39