选择两个不同字段之间的范围包含给定数字的数据
Posted
技术标签:
【中文标题】选择两个不同字段之间的范围包含给定数字的数据【英文标题】:Select data where the range between two different fields contains a given number 【发布时间】:2016-08-03 15:55:43 【问题描述】:我想在我的数据库中对输入值介于或等于这两个字段LOC_CEP_INI
和LOC_CEP_FIM
之间的文档进行查找查询
示例:用户向系统输入一个值为 69923994 的数字,然后我使用此输入在我的数据库中搜索具有此值的所有文档,该值介于字段 LOC_CEP_INI
和 LOC_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
【问题讨论】:
【参考方案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 中没有成功
【讨论】:
以上是关于选择两个不同字段之间的范围包含给定数字的数据的主要内容,如果未能解决你的问题,请参考以下文章