【问题标题】:Passing More than one where condition in MONGO DB find query在 MONGO DB 查找查询中传递多个 where 条件
【发布时间】:2013-03-19 15:15:49
【问题描述】:

我有 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

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

【问题讨论】:

    标签: mongodb find


    【解决方案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,
                                }                                
                        ]
                 }
        ]
    }
    

    现在查询各种属性将更加直接,包括能够查询值和外部字段。

    【讨论】:

      【解决方案2】:

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

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

      将返回集合中任何来自details 字段的条目具有正确日期的文档。它不会只返回 details 数组中的各个条目。

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

      【讨论】:

        【解决方案3】:

        这是您的查询,

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

        我猜 mongo 1.6.5 不支持聚合。参考文档一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多