2012-02-24 41 views
1

我需要一些想法/提示。這裏是我保存樣本文檔:Mongodb保存/ upsert使用C#驅動程序,連續陣列添加和現場更新到相同的文檔

{ 
    "_id" : new BinData(0, "C3hBhRCZ5ZFizqbO1hxwrA=="), 
    "gId" : 237, 
    "name" : "WEATHER STATION", 
    "mId" : 341457, 
    "MAC" : "00:00:00:00:00:01", 
    "dt" : new Date("Fri, 24 Feb 2012 13:59:02 GMT -05:00"), 
    "hw" : [{ 
     "tag" : "Weather Sensors", 
     "snrs" : [{ 
      "_id" : NumberLong(7), 
      "sdn" : "Wind Speed" 
     }, { 
      "_id" : NumberLong(24), 
      "sdn" : "Wind Gust" 
     }, { 
      "_id" : NumberLong(28), 
      "sdn" : "Wind Direction" 
     }, { 
      "_id" : NumberLong(31), 
      "sdn" : "Rainfall Amount" 
     }, { 
      "_id" : NumberLong(33), 
      "sdn" : "Rainfall Peak Amount" 
     }, { 
      "_id" : NumberLong(38), 
      "sdn" : "Barometric Pressure" 
     }], 
     "_id" : 1 
    }] 
} 

什麼我目前做的不過是使用C#驅動程序和執行.Save()到我的收藏得到UPSERT,我要的是有點兒一種混合的方法我猜。這裏有不同的操作,我需要能夠執行:

  1. 的Upsert整個文檔,如果它不存在
  2. 更新與新的時間戳DT場,如果該文件確實存在
  3. 對於硬件領域,我需要幾件事。如果hw._id存在,更新其標記字段,以及通過處理信噪比場或者更新現有條目因此SDN值被更新或添加全新entires時_id不存在

沒有什麼應該被從中移除hw陣列和任何東西都不應該從snrs數組中刪除。

標準的upsert似乎並沒有讓我知道我在做什麼,所以我正在尋找儘可能少的往返服務器來完成我所需要的最佳方式。我認爲一些$運營商可能是我在這裏需要的,但只需要一些關於如何最好地解決這個問題的想法。

我在這裏所做的要點是保持snrs條目的累積歷史文檔與即時的當前值,並保留陣列中的任何歷史條目,即使它們不再「活着」,正在被報告,等等。這允許將來報告當前不再存在的事情,但在過去的某個時間點。 _id值是應用程序生成的,在所有文檔中全局唯一,並且在初始創建後永遠不會更改。例如,上週「風速」正在報道中,但本週並非如此。這是_id值,但是,如果「風速」再次開始報告,則不會改變。跟隨?

如有需要,可以提供澄清或更多細節。

謝謝。

回答

2

通過將文檔的結構從嵌入式數組更改爲由_ids鍵入的子文檔,您可以執行此操作。 例如 「012」:「00:00:00:00:00:01」, 「_id」:1, 「dt」:ISODate(「2012-02-24T18:59:02Z」), 「 」 GID」:237, 「HW」:{ 「1」:{ 「信噪比」:{ 「1」: 「風速」, 「2」: 「風力」 }, 「標籤」: 「天氣傳感器」 } }, 「MID」:341457, 「名稱」: 「WEATHER STATION 1」 }

我用t創建的上述文件他以下UPSERT

db.foo.update(
{_id:1}, 
{ 
    $set: { 
     "gId" : 237, 
     "name" : "WEATHER STATION 1", 
     "mId" : 341457, 
     "MAC" : "00:00:00:00:00:01", 
     "dt" : new Date("Fri, 24 Feb 2012 13:59:02 GMT -05:00"), 
     "hw.1.tag" : "Weather Sensors", 
     "hw.1.snrs.1" : "Wind Speed", 
     "hw.1.snrs.2" : "Wind Gust" 
    } 
}, 
true 
) 

現在,當我運行

db.foo.update(
{_id:1}, 
{ 
    $set: { 
     "dt" : new Date(), 
     "hw.2.snrs.1" : "Rainfall Amount" 
    } 
}, 
true 
) 

我得到

{ 
    "MAC" : "00:00:00:00:00:01", 
    "_id" : 1, 
    "dt" : ISODate("2012-03-07T05:14:31.881Z"), 
    "gId" : 237, 
    "hw" : { 
      "1" : { 
        "snrs" : { 
          "1" : "Wind Speed", 
          "2" : "Wind Gust" 
        }, 
        "tag" : "Weather Sensors" 
      }, 
      "2" : { 
        "snrs" : { 
          "1" : "Rainfall Amount" 
        } 
      } 
    }, 
    "mId" : 341457, 
    "name" : "WEATHER STATION 1" 
} 
相關問題