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}}....]})