2012-02-24 12 views
1

私はいくつかのアイデアやヒントが必要です。ここで私が保管していますサンプル文書れる:Mongodb C#ドライバを使ったsave/upsert、連続した配列の追加、同じ文書へのフィールド更新

{ 
    "_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()を実行しているやって何が、しかし、私が欲しいのはちょっとハイブリッド手法であります私は推測する。ここで私が実行できるようにする必要がある明確な操作です:

  1. 文書全体アップサート文書はHWフィールドについて
  2. 存在しない場合、それは新しいタイムスタンプ付きのDTフィールドに
  3. アップデート存在しない場合私はここにいくつかのものが必要です。 hw._idが存在する場合は、同様SDN値が更新されるように、いずれかの更新既存のエントリによってSN比のフィールドを扱うか_idが

何が今までから削除してはならない存在しない場合に、全く新しいのentiresを追加するなど、そのタグフィールドを更新hw配列とsnrs配列から何も削除する必要はありません。

標準的なアップサンプリングは、私の後ろのものを私に知らせるようには見えないので、できるだけサーバーへのラウンドトリップを少なくするための最良の方法を探しています。私は$ Operatorsのいくつかが私がここで必要としているものかもしれないと思っていますが、これに最も近づけるには何らかの考えが必要です。

ここで私がやっていることの要点は、snrsエントリの累積履歴文書を即時の現在の値で保持し、アレイの履歴エントリがもはや「生きていない」、これにより、現在の時刻には存在しなくなったものの、過去のある時点のものについての将来の報告が可能になります。 _id値はアプリケーションによって生成され、すべてのドキュメントでグローバルに一意であり、最初の作成後に変更されることはありません。たとえば、先週の「風速」が報告されていましたが、今週はそれがありません。しかし、 "風速"が再び報告を開始すると、値は変更されません。フォローですか?

必要に応じて明確化または詳細を提供することができます。

ありがとうございました。

答えて

2

文書の構造を埋め込み配列から_idsによってキーで区切られたサブ文書に変更することで、これを行うことができます。例: { "MAC": "00:00:00:00:00:01"、 "_id":1、 "dt":ISODate( "2012-02-24T18:59:02Z")、 " GID」:237、 "HW":{ "1":{ "SN比":{ "1": "風速"、 "2": "風突風" }、 "タグ": "天気センサ" }} 、 "MID":341457、 "名前": "天気STATION 1" }

私はtで上記の文書を作成しました私は私が

{ 
    "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" 
} 
を取得

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

を実行すると、彼は今

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 
) 

アップサート以下

関連する問題