0

私はmongo DBコレクション、つまり次のドキュメント構造を持つ学生を持っています。

名前:詳細:日付:値

したがって、名前が 1 つの場合、詳細リストは 1 つになります。

その詳細リストには複数の日付リストがあります

そして、各日付リストには複数の値リストがあります

  {
        "_id" : ObjectId("51472e9fd29a736d83c27ca3"),
        "name" : "Arun",
        "details" : [
                {
                        "date" : "2015-01-17",                        
                        "isNew" : false,
                        "isOld" : true,
                        "values" : [
                                {
                                        "money" : "330.0",
                                        "new" : false,
                                        "old" : true,
                                },
                                {
                                        "money" : "340.0",
                                        "new" : false,
                                        "old" : true,
                                }                                
                        ]
                    },  
                    {
                        "date" : "2015-01-17",                        
                        "isNew" : false,
                        "isOld" : false,                        
                        "values" : [
                                {
                                        "money" : "330.0",
                                        "new" : false,
                                        "old" : false,
                                },
                                {
                                        "money" : "340.0",
                                        "new" : false,
                                        "old" : false,
                                }                                
                        ]
                    },
                    {
                        "date" : "2015-01-17",                        
                        "isNew" : true,
                        "isOld" : false,
                        "values" : [
                                {
                                        "money" : "330.0",
                                        "new" : true,
                                        "old" : false,
                                },
                                {
                                        "money" : "340.0",
                                        "new" : true,
                                        "old" : false,
                                }                                
                        ]
                 },
                 {
                        "date" : "2013-10-19",                        
                        "isNew" : true,
                        "isOld" : false,
                        "values" : [
                                {
                                        "money" : "330.0",
                                        "new" : true,
                                        "old" : false,
                                },
                                {
                                        "money" : "340.0",
                                        "new" : true,
                                        "old" : false,
                                }                                
                        ]
                 }
        ]
    }






What is need is, i want to SELECT "all the date lists" where "name" : "Arun" and "date" : "2015-01-17",I tried this way and it is not working as expected.I am getting all the dates instead 2015-01-17 in return.

    I think only one where condition is working here and that is "name" : "Arun" , Query is not considering "details.date" : "2015-01-17" in where condition.



db.student.find({ "details.date" : "2015-01-17","name" : "Arun" },{"details.date":1}).pretty()
{
        "_id" : ObjectId("51472e9fd29a736d83c27ca3"),
        "details" : [
                {
                        "date" : "2015-01-17"
                },                                
                {
                        "date" : "2015-01-17"
                },                
                {
                        "date" : "2015-01-17"
                },                
                {
                        "date" : "2013-10-19"
                }
        ]
}

現在mongo 1.6.5を使用しています

誰かがこれを解決するのを手伝ってくれますか?

4

3 に答える 3

1

まず、現在のバージョンの MongoDB にアップグレードする必要があります。1.6 は現在の「メジャー」バージョンから 3 バージョン遅れています。

次に、スキーマを修正する必要があります。「単一の名前に対して、詳細リストが 1 つある」と言います。このリスト/配列に何かを追加し続けると、無限に成長し続け、スキーマ設計が不適切です。さらに、ドキュメントと一緒にフェッチする配列値をグループ化する方がより正確です。この場合、特にドキュメントですべての値をフェッチするのではなく、特定の要素のみをフェッチする必要があります。日付に加えて、isOld/isNew フィールドは、これらのエントリの一部が古い値に対応し、他のエントリが最新であることを示唆しており、それらを同じドキュメントにまとめるのは悪い考えです.

したがって、私の推奨事項は、学生ごとに複数のドキュメントになるように構造を変更することです。

    {
            "name" : "Arun",
            "date" : "2015-01-17",                        
            "isNew" : false,
            "isOld" : true,
            "values" : [
                       {
                                  "money" : "330.0",
                                 "new" : false,
                                 "old" : true,
                        },
                         {
                                   "money" : "340.0",
                                   "new" : false,
                                   "old" : true,
                          }                                
                       ]
   }, 
   { 
   "name" : "Arun",
    "date" : "2015-01-17",                        
    "isNew" : false,
    "isOld" : true,
    "values" : [
                        {
                            "money" : "330.0",
                             "new" : false,
                             "old" : false,
                        },
                        {
                              "money" : "340.0",
                               "new" : false,
                              "old" : false,
                        }                                
               ]
    },
    {
     "name" : "Arun",
    "date" : "2015-01-17",                        
    "isNew" : false,
    "isOld" : true,
    "values" : [
               {
                           "money" : "330.0",
                               "new" : true,
                                    "old" : false,
                            },
                            {
                                    "money" : "340.0",
                                    "new" : true,
                                    "old" : false,
                            }                                
                    ]
             },
      {  "name" : "Arun",
    "date" : "2013-10-19",                        
    "isNew" : true,
    "isOld" : false,
    "values" : [
         {

                                    "money" : "330.0",
                                    "new" : true,
                                    "old" : false,
                            },
                            {
                                    "money" : "340.0",
                                    "new" : true,
                                    "old" : false,
                            }                                
                    ]
             }
    ]
}

これで、さまざまな属性に対するクエリがより簡単になり、値や外部フィールドでクエリを実行できるようになりました。

于 2013-03-19T16:36:29.913 に答える
0

これがあなたの質問です、

db.sandy.aggregate(
                    {$unwind : "$details"},
                    {$match : {"details.date" : "2015-01-17","name" : "Arun"}}
                   )

そして、mongo 1.6.5 は集計をサポートしていないと思います。一度Docを参照してください。

于 2013-03-19T16:05:36.560 に答える
0

実際、クエリは両方のフィールドに一致しています。出力は、MongoDB が配列を処理する方法の副産物です。マッチング

"details.date" : "2015-01-17"

フィールドからのエントリのいずれかがdetails正しい日付を持つコレクション内のドキュメントを返します。詳細配列から個々のエントリを返すだけではありません。

これを行うには、返される配列内のエントリを制限するために、プロジェクションの$elemMatch演算子を調べることができます。

于 2013-03-19T15:57:52.010 に答える