2013-12-11 36 views
6

我有如下形式的文件:

{ 
    _id : ObjectId(.....), 
    prop1 : "foo", 
    links : [ 1, 2, 3, 4 ] 
} 

{ 
    _id : ObjectId(.....), 
    prop1 : "bar", 
    links : [ 5, 6, 7, 8 ] 
} 

我使用聚合框架來處理這些文件,我用$放鬆,生成文檔中鏈接數組中的每個值。

但我有三種情況需要在調用$ unwind之前更新文檔,我一直在尋找$ project操作,但是我找不到有關如何爲以下情況創建或更新數組的信息。

1)中的鏈接屬性缺失

{ 
    _id : ObjectId(.....), 
    prop1 : "far" 
} 

我需要插入的鏈接陣列

2)中的鏈接陣列屬性爲空數組

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [] 
} 

我需要插入將值存入數組

3)鏈接數組的值太少

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [ 9, 10 ] 
} 

我需要插入額外的值到數組

+1

我看''cond'有條件地添加值:http://docs.mongodb.org/manual/reference/operator/aggregation/cond/ – WiredPrairie

+0

我熟悉$ cond,問題我的是,我不知道如何實際創建數組或更新數組值。我剛更新了這個問題以更好地反映這一點。 – user2808819

+0

你不能永久修改文件。只有在流水線期間,您纔可以修改字段的值。 – WiredPrairie

回答

2

您應該能夠使用$isNullreference):

db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} }) 

很簡單的邏輯,如果引用的字段($links)是null,則使用替換值(在此例中爲[5, 6])。在示例中,我將該字段重命名爲the_links。假設links字段爲空(而不是空數組)。鑑於數據,如:

{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [ 1, 2, 3, 4 ] } 
{ "_id" : ObjectId(...), "prop1" : "bar" } 

聚集以上生產:

{ 
    "result" : [ 
      { 
        "_id" : ObjectId("52a869d51d02442354276cff"), 
        "the_links" : [ 
          1, 
          2, 
          3, 
          4 
        ] 
      }, 
      { 
        "_id" : ObjectId("52a869e31d02442354276d00"), 
        "the_links" : [ 
          5, 
          6 
        ] 
      } 
    ], 
    "ok" : 1 
} 

如果鏈接是一個空數組[]而非null,你可以這樣做:

db.test.aggregate({ $project : 
    { the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} }) 

但是,如果它是空或[],那麼你需要添加一個額外的檢查條件作爲$or$cond運營商。

如果列表中有值,並且您想要有條件地添加更多值,那麼MongoDB的當前(2.4.x)生產版本沒有有效的解決方案。開發分支有一個名爲$size的運算符,它將返回一個數組的長度(jira)。用另一種發展的功能,稱爲$ setUnion然後,您可以有條件地將它們添加:

$ setUnion 接受任意數量的陣列,並返回一個包含出現在任何輸入數組中的元素 的數組。

+0

看起來它會適用於案例1和2,對案例3有任何想法,我需要爲現有數組添加值。我一直在研究mongo 2.6的變化,並且有一個$ map函數可以應用於數組中的每個條目,但它看起來不會讓我插入數值到數組中。 – user2808819

+0

實際上剛剛在2.6中看到了新的集合運算符,$ setUnion將獲取任意數量的數組並生成它們的並集。我可能能夠使用$ project將新值添加到新的數組屬性中,然後使用$ setUnion將它們合併,或者甚至可以使用文字數組作爲值之一。我將不得不下載2.6並嘗試一下。 – user2808819

+0

你能解釋一下你正在嘗試做什麼嗎?你爲什麼要向數組中添加值?我添加了一些關於未來版本支持的細節。 – WiredPrairie