1

個人の毎日の統計を追跡しようとしています。

「履歴」内に新しい日を追加するのに苦労しており、新しいデータが入ってくると「walkingSteps」を更新するポインターを使用することもできます.

私のスキーマは次のようになります。

{
"_id": {
    "$oid": "50db246ce4b0fe4923f08e48"
},
"history": [
    {
        "_id": {
            "$oid": "50db2316e4b0fe4923f08e12"
        },
        "date": {
            "$date": "2012-12-24T15:26:15.321Z"
        },
        "walkingSteps": 10,
        "goalStatus": 1
    },
    {
        "_id": {
            "$oid": "50db2316e4b0fe4923f08e13"
        },
        "date": {
            "$date": "2012-12-25T15:26:15.321Z"
        },
        "walkingSteps": 5,
        "goalStatus": 0
    },
    {
        "_id": {
            "$oid": "50db2316e4b0fe4923f08e14"
        },
        "date": {
            "$date": "2012-12-26T15:26:15.321Z"
        },
        "walkingSteps": 8,
        "goalStatus": 0
    }
]

}

db.history.update( ? )

私はmongodbのドキュメントを閲覧(および試行)してきましたが、私のようなダミーまで完全に分解することはできません...彼らの例を私のセットアップに完全に翻訳することはできませんでした.

助けてくれてありがとう。

E =初心者がプログラミングを学ぼうとしている

4

3 に答える 3

5

1 日追加:

user = {_id: ObjectId("50db246ce4b0fe4923f08e48")}
day = {_id: ObjectId(), date: ISODate("2013-01-07"), walkingSteps:0, goalStatus: 0}
db.users.update(user, {$addToSet: {history:day}})

WalkingSteps の更新:

user = ObjectId("50db246ce4b0fe4923f08e48")
day = ObjectId("50db2316e4b0fe4923f08e13") // second day in your example
query = {_id: user, 'history._id': day}

db.users.update(query, {$set: {"history.$.walkingSteps": 6}})

これは、$位置演算子を使用します。

ただし、別の履歴コレクションを持つ方が簡単かもしれません。


[編集] 個別のコレクションについて:

  • 日数を追加すると、ドキュメントのサイズが大きくなり、ディスク上での再配置が必要になる場合があります。これにより、パフォーマンスの問題や断片化が発生する可能性があります。
  • 日を削除しても、ディスク上のドキュメント サイズは縮小されません。
  • これにより、クエリがより簡単/簡単になります (たとえば、一定期間の検索)。
于 2013-01-06T18:57:23.587 に答える
1

@Justin Caseは正しい答えを出していますが、いくつかのことをうまく説明していません。

まず最初に、彼が日付の解像度を取り除き、その形式を次のように日付と時刻ではなく単に日付に変更していることに気付くでしょう。

day = {_id: ObjectId(), date: ISODate("2013-01-07"), walkingSteps:0, goalStatus: 0}

これは、00:00:00ATM を使用している正確な時間ではなく、すべての日付に時間があることを意味します。これにより、1 日あたりのクエリが容易になるため、次のようなことができます。

db.col.update(
    {"_id": ObjectId("50db246ce4b0fe4923f08e48"), 
    "history.date": ISODate("2013-01-07")}, 
    {$inc: {"history.$.walkingSteps":0}}
)

および他の同様のクエリ。

これにより、$addToSet は実際にそのルールを強制しますが、このサブドキュメントのデータは変更される可能性があるため、つまり、walkingStepsインクリメント$addToSetはここではうまく機能しません。

これは、チェックされた回答から変更するものです。は重く、ここでは何も役に立たない$pushので、代わりに orを使用するでしょう。$addToSet

私の見解では、別の履歴コレクションの理由は、あなたが以前に言ったことです:

はい、その日の履歴項目の量です。

したがって、この配列には一連の日数が含まれていますが、これは問題ありませんが、取得したい数値のように聞こえますがwalkingSteps、履歴アイテムのセットは別のコレクションにある必要がありwalkingSteps、その中のアイテムの数に応じて設定します今日のその他のコレクション:

db.history_items.find({date: ISODate("2013-01-07")}).count();
于 2013-01-06T19:36:15.520 に答える
0

MongoDB Manualを参照すると$、配列内の要素の位置を明示的に指定せずに更新する配列フィールド内の要素を識別する位置演算子です。位置 $ 演算子は update() メソッドで使用され、更新クエリ セレクターの最初の一致のプレースホルダーとして機能します。

したがって、次のようにコレクションを更新するコマンドを発行すると:

db.history.update(
   {someCriterion: someValue },
   { $push: { "history": 
               {"_id": {
                   "$oid": "50db2316e4b0fe4923f08e12"
               },
              "date": {
                   "$date": "2012-12-24T15:26:15.321Z"
               },
           "walkingSteps": 10,
           "goalStatus": 1
           } 
   } 
)

Mongodb は$oid、 と$dateをいくつかの位置パラメータとして識別しようとする場合があります。や など$のアトミック オペレータの一部でもあります。したがって、Mongodb ではこの特殊文字を使用しない方がよいでしょう。$set$push

于 2013-01-06T19:04:07.330 に答える