Mongodb Mongo查询字段名
我有一个集合,它总结了与其他集合中的文档相关的一些数据。其结构大致如下:Mongodb Mongo查询字段名,mongodb,Mongodb,我有一个集合,它总结了与其他集合中的文档相关的一些数据。其结构大致如下: { campaignId : ObjectId(...) impressions : { ... '2016-09-20': 1800, '2016-09-21': 1500, '2016-09-22': 2000 }, clicks : { ... '2016-09-20': 60,
{
campaignId : ObjectId(...)
impressions : {
...
'2016-09-20': 1800,
'2016-09-21': 1500,
'2016-09-22': 2000
},
clicks : {
...
'2016-09-20': 60,
'2016-09-21': 55,
'2016-09-22': 80
}
}
我知道有更好的方法,但这是我无法控制的
问题是我需要查询在前7天有印象的文档
所以我需要根据字段键而不是值进行查询
是否可以在查询中执行此操作?因为您需要根据字段键进行查询,而不是首先需要提供所有前N天(在您的情况下为7天)的键的值。 在构建这些键(以编程方式或手动方式)之后,您可以通过不同的方式实现这一点------ 1-使用 二,。使用 以编程方式构建此类查询(以JavaScript为例构建查询) 这将为您提供所需格式的最终查询
{"$or":[{"impressions.2016-09-21":{"$exists":true}},{"impressions.2016-09-20":{"$exists":true}}]}
有趣
我认为您必须使用$exists动态创建一个or查询,并以七个日期作为参数,我认为没有任何有效的方法可以根据lte或gte等条件进行现场查询
db.campaign.find({$or : [{impressions.2016-09-21 : {$exists : true}},{impressions.2016-09-20 : {$exists : true}},{impressions.2016-09-19 : {$exists : true}}....]})
我知道您不能硬编码查询中的日期,因为最后7天是动态的,但您可以轻松使用函数创建动态查询字符串,然后将其用于查询
另一种方法(我可能不工作,但值得一试)是在查询中尝试$where,$where接受一个函数,您可以尝试操纵该函数来实现所需的功能,这将是混乱的,但您所要做的就是将“this”用作文档,如果文档验证您的条件,则返回true,否则返回false
总而言之,解决这个问题没有简单的办法 我认为唯一的方法是拉(找到)印象并编写代码来解析它们并过滤(或者)你可以尝试regex,但我觉得这比让你的客户过滤日期范围更笨拙。完全同意这种方法。
var previous2days = ["2016-09-21","2016-09-20"]
var query = { "$or" : [] }
for(var key in previous2days) {
var q = {}
q["impressions."+previous2days[key]] = { "$exists" : true }
query.$or.push(q)
}
console.log(JSON.stringify(query))
{"$or":[{"impressions.2016-09-21":{"$exists":true}},{"impressions.2016-09-20":{"$exists":true}}]}
db.campaign.find({$or : [{impressions.2016-09-21 : {$exists : true}},{impressions.2016-09-20 : {$exists : true}},{impressions.2016-09-19 : {$exists : true}}....]})