2

mongodb でスケジュール スキーマを設計する必要があります。元のデータ形式は {"schedule_begin":Date,"schedule_end":Date,"schedule_days_runs":"1111100"}のようなものです。

スキーマには、データ"schedule_days_runs":"1111100"を持つプロパティschedule_days_runsがあることに注意してください。1 週間は 7 日で、「1」は稼働していることを表し、「0」は稼働していないことを表します。

基本的に、アプリケーションが行うことは、特定の日付 (月曜日など) に稼働しているすべてのスケジュールを見つけることです。つまり、 schedule 、schedule_start =< one_day <= schedule_endをクエリし、クエリされたスケジュールが月曜日にも稼働していることを確認する必要があります。

簡単な解決策は、"1111100" を文字列で mongodb に直接格納し、クエリに schedule_start と schedule_end のみを使用し、アプリケーション ロジックを使用して結果を取得することです。ただし、通常は何千ものクエリを取得し、クエリの半分は答えではないため、このソリューションは便利ではありません。たとえば、特定の日の '1111100' (スケジュールは月曜日から金曜日まで稼働) の稼働スケジュールを取得するには、クエリの結果として、'0000011' (スケジュールは週末に稼働) のような多くの役に立たない情報が返されます。

私はより良い解決策を見つけようとしていますが、誰かがより良いアイデアを持っていますか?

4

2 に答える 2

2

私はまだ で最初の赤ちゃんのステップを実行していますがmongodb、異なる値を持つ配列を使用する方が適していると思いますmongodb。これらの行に沿ったもの:

{ 
  "schedule_begin": Date,
  "schedule_end":Date,
  "schedule_days_runs": ["mo", "tu", "we", "th", "fr", "sa", "su"]
}

次に、次のようなクエリを使用できます。

{ schedule_days_runs: "mo" }

月曜日に実行するすべてを取得します。

私がまだ知っているように、そこにはいくつかのタイプミスがあるかもしれません。また、私が見たところ、mongodb では、リレーショナル DB を使用して学んだほとんどすべてから離れなければなりません。これは別のことです。白紙のアプローチを使用することで、リレーショナル アプローチでは解決が困難だったいくつかの問題を解決することができました。

この質問を参照として使用しました: Mongoで配列要素を照会する

配列の長さを調べるには、次の質問が役に立ちます: Mongo DB では、配列サイズが 1 より大きいドキュメントを見つけるにはどうすればよいですか?

見積もり:

$where の使用

db.accommodations.find( { $where: "this.name.length > 1" } );

したがって、これに基づいて、次のことを試してください。

{ $where : "this.schedule_days_runs.length > 1" }
于 2013-03-05T09:34:03.683 に答える
1

アプリケーションが配列に要素を追加する方法はわかりませんが、1 つのオプションは、誰かが実際に作業している場合にのみ、配列を使用$pushまたは追加することです。$addToSet次に、配列の長さをチェックして、各人が何日働いたかを知ることができます。

集計フレームワーク (これがより良いオプションだと思います) を使用して、クエリを実行し、レポートを作成することもできます。たとえば、次のドキュメント構造を使用します。

{ 
  "userId":"user ID"
  "schedule_begin": "Date",
  "schedule_end": "Date",
  "schedule_days_runs": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
}

次のクエリを実行して、月曜日に誰が勤務したかを調べることができます。

db.schedule.aggregate([{$unwind:"$schedule_days_runs"},{$group:{"_id":{"working_days":"$schedule_days_runs", "name":"$userId"}}},{$match:{"_id.working_days":"Monday"}},{$sort:{"_id.name":1}}])

これにより、配列の各要素から個別のドキュメントが作成され$unwind$groupそれらは userId と勤務日数によって作成さ$matchれ、月曜日に勤務した人のみが含まれます。埋め込みドキュメントに到達するためのドット表記に注意してください。集計フレームワークでは、フィールドを再定義することもできます"name":"$userId"。このクエリの結果の例は次のとおりです。

{
    "result" : [
            {
                    "_id" : {
                            "working_days" : "Monday",
                            "name" : "Charlie Sheen"
                    }
            },
            {
                    "_id" : {
                            "working_days" : "Monday",
                            "name" : "Donald Duck"
                    }
            },
            {
                    "_id" : {
                            "working_days" : "Monday",
                            "name" : "Superman"
                    }
            }
    ],
    "ok" : 1

}

集計フレームワークを使用すると、さらに多くのことができ、クエリの各部分が情報を次の部分にパイプします。上記のように、$unwind は情報を $group にパイプし、ドキュメントと照合します。続行できます。詳細については、ドキュメントを参照してください

于 2013-03-05T09:34:38.800 に答える