2013-03-19 48 views
0

我有蒙戈DB集合即学生与下面的文档结构,传递多个地方条件MONGO DB查找查询

名称:细节:日期:值

所以,对于一个单独的名称,我们将有一个详细清单,

,详细名单将有多个最新名单

而且每个日期列表将有多个值列表

{ 
     "_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

有人能帮我解决这个问题吗?

回答

1

首先,您需要升级到当前版本的MongoDB。 1.6现在是当前“主要”版本的三个版本。

其次,您需要修复您的模式。你说“对于单个名称,我们将有一个详细信息列表” - 如果你继续向这个列表/数组添加东西,它将会无限增长,这是一个糟糕的模式设计。另外,将数组中的值与文档一起进行分组更加正确 - 在这种情况下,您特别不想使用文档获取所有值,只需要为特定的元素提取元素日期,再加上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, 
          }         
        ] 
      } 
    ] 
} 

现在,它会更直截了当地对各种属性,包括能够在值查询作为查询以及外场。

0

您的查询实际上是匹配这两个字段。输出是MongoDB处理数组的方式的副产品。匹配来

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

将返回集合中的任何文件,任何地方从details领域中的条目有正确的日期。它不会只返回details数组中的单个条目。

为此,您可能需要查看$elemMatch运算符进行投影,以限制返回的数组中的条目。

0

这是您的查询,

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

我猜蒙戈1.6.5不支持聚合。请参阅Doc一次。