【问题标题】:Select data where the range between two different fields contains a given number选择两个不同字段之间的范围包含给定数字的数据
【发布时间】:2016-08-03 15:55:43
【问题描述】:

我想在我的数据库中对输入值介于或等于这两个字段LOC_CEP_INILOC_CEP_FIM 之间的文档进行查找查询

示例:用户向系统输入一个值为 69923994 的数字,然后我使用此输入在我的数据库中搜索具有此值的所有文档,该值介于字段 LOC_CEP_INILOC_CEP_FIM 之间。

我的一个文档(在此示例中,此文档被查询选中,因为输入在范围内):

 {
   "_id" : ObjectId("570d57de457405a61b183ac6"),
   "LOC_CEP_FIM" : 69923999, //this field is number
   "LOC_CEP_INI" : 69900001, // this field is number
   "LOC_NO" : "RIO BRANCO",
   "LOC_NU" : "00000016",
   "MUN_NU" : "1200401",
   "UFE_SG" : "AC",
   "create_date" : ISODate("2016-04-12T20:17:34.397Z"),
   "__v" : 0
}

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:
    db.collection.find( { field: { $gt: value1, $lt: value2 } } );
    

    https://docs.mongodb.com/v3.2/reference/method/db.collection.find/ 使用 $gt 和 $lt 参考这个 mongo 提供范围设施。

    【讨论】:

      【解决方案2】:

      您必须反转字段名称和查询值。

      db.zipcodes.find({
          LOC_CEP_INI: {$gte: 69923997},
          LOC_CEP_FIM: {$lte: 69923997}
      });
      

      要使您的查询示例正常工作,您需要您的文档包含一个 array 属性,并且此道具中的每个项目都包含一个 69923997 道具。然后,Mongo 会检查这个 69923997 属性的值是否介于 "LOC_CEP_INI""LOC_CEP_FIM" 之间,对于您的 array 属性中的每个项目。

      我也不确定你是想要LOC_CEP_INI <= 69923997 <= LOC_CEP_FIM还是相反,所以你可能需要切换$gte$lte条件。

      【讨论】:

      • 嗯,如果我没有数组属性?
      • 那你就写我给的代码示例。我的意思是,如果您写 db.zipcodes.find({array: ...}),mongo 将尝试在您的文档的 array 属性上匹配您的条件。如果他们没有,就跳过它,直接写$elemMatch条件
      • #VonD 我按照您的代码尝试过,但我收到错误错误:错误:{“waitedMS”:NumberLong(0),“ok”:0,“errmsg”:“未知顶部级别操作符:$elemMatch", "code" : 2 }
      • 尝试使用 db.zipcodes.find({ $elemMatch: { LOC_CEP_INI: {$gte: 69923997}, LOC_CEP_FIM: {$lte: 69923997} } });
      • @michelpm1 抱歉,我对 array 的事情感到困惑。我已经编辑了我的答案。如果您的道具之一是数组,$elemMatch 很有用。假设您的文档为 items 道具,并且每个项目都有 LOC_CEP_INI LOC_CEP_FIM 道具,那么您将编写 {items: {$elemMatch: { LOC_CEP_INI: {$gte: 69923997}, LOC_CEP_FIM: {$lte: 69923997} }}}
      【解决方案3】:

      db.zipcodes.find( {
      "LOC_CEP_INI": { "$lte": 69900002 }, "LOC_CEP_FIM": { "$gte": 69900002 } })

      【讨论】:

        【解决方案4】:

        这里是根据需要使用它的逻辑:

         Userdb.aggregate([
            { "$match": { _id: ObjectId(session._id)}},
            { $project: {
                checkout_list: {
                    $filter: {
                        input: "$checkout_list",
                        as: "checkout_list",
                        cond: {
                            $and: [
                                { $gte: [ "$$checkout_list.createdAt", new Date(date1) ] },
                                { $lt: [ "$$checkout_list.createdAt", new Date(date2) ] }
                            ]
                        }    
                    }
                }
            }
        }
        

        这里我使用过滤器,由于某些原因,对嵌套数据的数据查询在 mongodb 中没有成功

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-13
          • 2014-02-20
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 2020-09-25
          相关资源
          最近更新 更多