当前位置: 首页 > 面试题库 >

查询与mongodb中的条件匹配的文档及其所有子文档(使用spring)

苏志
2023-03-14
问题内容

我有一个MongoDB,用于存储来自不同传感器的数据。它具有以下结构:

 {
     "_id" : 1,
     "sensorName" : "Heart Rate",
     "samplePeriod" : 1000,
     "data" : [
             {
                 "timestamp" : NumberLong("1483537204046"),
                 "dataPoints" : [ 68 70 ]
             },
             {
                 "timestamp" : NumberLong("1483537206046"),
                 "dataPoints" : [ 68 70 ]
             }
     ]
}
{
    "_id" : 2,
    "sensorName" : "Ambient Light",
    "samplePeriod" : 500,
    "data" : [
            {
                "timestamp" : NumberLong("1483537204058"),
                "dataPoints" : [ 56, 54, 54, 54 ]
            },
            {
                "timestamp" : NumberLong("1483537206058"),
                "dataPoints" : [ 56, 54, 54, 54 ]
            }
    ]
}

现在,例如,我需要“心率”-包含所有字段和“数据”字段的文档-匹配条件“ 1483537204000和1483537214000之间的时间戳记”的子文档。

我已经在另一个问题中的mongo shell中获得了有关如何执行此操作的答案。参见以下代码:

aggregate([{
    $match: {
        "_id": 1
    }
}, {
    "$project": {
        "_id": 1,
        "sensorName": 1,
        "samplePeriod": 1,
        "data": {
            "$filter": {
                "input": "$data",
                "as": "result",
                "cond": {
                    $and: [{
                        $gte: ["$$result.timestamp", 1483537204000]
                    }, {
                        $lte: ["$$result.timestamp", 1483537214000]
                    }]
                }
            }
        }
    }
}])

但是如何在java spring-data中做到这一点?似乎在spring-data中没有像$ filter这样的东西。有解决方法吗?

反之,$ filter的效率如何?您能想到在mongodb中构造此类数据的更有效/更实用的方法吗?

提前致谢!


问题答案:

您需要利用spring mongo数据依赖项中提供的MongoTemplate。当前发行版中没有对$
filter的现成支持。利用AggressionExpression。在项目中包括以下投影。使用1.8.5 Spring mongo数据版本。

Aggregation aggregation = newAggregation(
        match(Criteria.where("_id").is(1)),
        project( "_id", "sensorName", "samplePeriod").and(new AggregationExpression() {
            @Override
            public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
                DBObject filter = new BasicDBObject("input", "$data").append("as", "result").append("cond",
                        new BasicDBObject("$and", Arrays.<Object> asList(new BasicDBObject("$gte", Arrays.<Object> asList("$$result.timestamp", 1483537204000L)),
                                new BasicDBObject("$lte", Arrays.<Object> asList("$$result.timestamp", 1483537214000L)))));
                return new BasicDBObject("$filter", filter);
            }
        }).as("data")
);

List<BasicDBObject> dbObjects = monoTemplate.aggregate(aggregation, "collectionname", BasicDBObject.class).getMappedResults();


 类似资料:
  • 我有一个MongoDB存储来自不同传感器的数据。它具有以下结构: 例如,现在我需要“heart rate”-文档的所有字段和“data”-子文档的所有字段都符合条件“时间戳在1483537204000和1483537214000之间”。

  • 我有一个如下的房间模式: 它包含一个事件ID数组。事件架构: 我试过这样的东西: 但它当然不起作用(房间总是空数组)。我真的很难弄清楚。 如何查询具有基于子文档(事件)的条件的文档(房间)?

  • 我有一个集合,其中包含具有以下结构的文档: 我想在1个查询中获取存在或等于的所有文档。即与列表中的键匹配的文档。 在MongoDB中有没有办法做到这一点?

  • 我试图使用.NET驱动程序查询mongodb文档,我想在不创建类对象的情况下获取特定文档中的所有字段,因为这些文档是动态生成的,我只知道一个字段名,即,_id。如何获取整个文档 当字段已知时,这工作正常

  • 来自< code>$elementMatch的MongoDB文档: $elemMatch运算符将包含数组字段的文档与至少一个与所有指定查询条件匹配的元素匹配。 但是,如何将包含数组字段的文档与与查询匹配的所有元素进行匹配? 例如,我有这样的文档: 我需要匹配所有具有所有 如果我使用以下查询: 该文档将被匹配,因为至少有一个价格 我也试过这个,但它似乎不工作: 有没有办法排除查看所有价格而不是至少一

  • 我想只从我的两个对象数组和中得到那些符合标准的子文档。即使我已经找到了这个stackoverflow答案#2(根据标准查找猫鼬子文档),它对我来说并不像期望的那样工作,或者我错过了一些东西。 我的文档如下所示: 它将在和中打印项目及其所有子文档。但是,我只想获取与给定上载id匹配的子文档。我做错了什么? 编辑:这个问题是指用猫鼬来解决它。我不能在Mongoose中使用这个问题的集合语句(只检索Mo