小编use*_*814的帖子

MongoDB $ aggregate $ push Java Spring Data中的多个字段

我有一个mongo聚合组查询:

db.wizard.aggregate(
{
$group: {
    _id: "$title",
    versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}}
    }
})
Run Code Online (Sandbox Code Playgroud)

我在Java Spring-Data-MongoDB中需要这个查询,我目前的解决方案如下所示:

    Aggregation agg = Aggregation.newAggregation(
            Aggregation.group("title").
                    push("version").as("versions")
    );
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何为push方法添加更多字段(版本,作者,dateAdded).是否可以使用Spring-Data-MongoDB?

java spring mongodb spring-mongo aggregation-framework

6
推荐指数
1
解决办法
7076
查看次数

如何在spring mongodb中检索数组中的匹配元素?

我试图检索具有特定“_id”的文档和具有另一个特定“_id”的单个嵌入文档。

我的文档代表一个目录,它包含一系列课程。

示例数据:

'_id': ObjectId('1111'),
'name': 'example catalog',
...
...
'courses': [
     { 
         '_id': ObjectId('2222'),
         'name': 'my course',
         ...
     },
     {
         ....
     }
Run Code Online (Sandbox Code Playgroud)

在 mongod 我运行这个聚合查询,并得到我想要的:

db.getCollection('catalogs').aggregate(
{ $match: { '_id': ObjectId('58e8da206ca4f710bab6ef74') } },
{ $unwind: '$courses' },
{ $match: { 'courses._id': ObjectId('58d65541495c851c1703c57f') } })
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,我已经恢复了单个目录实例,其中包含单个课程实例。

在我的 java repo 中,我试图做同样的事情:

    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.match(Criteria.where(Catalog.ID_FIELD).is(catalogId)),
            Aggregation.unwind(Catalog.COURSES_FIELD, true),
            Aggregation.match(Criteria.where(Catalog.COURSES_FIELD + '.' + Course.ID_FIELD).is(embeddedCourseId))
    );
    AggregationResults<Catalog> results = mongoTemplate.aggregate(aggregation,
            Catalog.class, Catalog.class);

    List<Catalog> catalog  = results.getMappedResults();
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我有一个“示例目录”的实例,其中包含空的课程数组。

在调试时,我发现里面results有两个返回的 props。第一个是我使用过的,称为mappedResults(代表从 …

java spring mongodb aggregation-framework

6
推荐指数
1
解决办法
1万
查看次数

由于 com.mongodb.BasicDBObject 添加多个条件 GridFSDBFile 查询时异常的限制

我想在 GridFSDBFile 中添加多个条件,我已经迭代了地图并形成了条件对象,但我遇到了以下异常

由于 com.mongodb.BasicDBObject 的限制,您不能添加指定的第二个 '$and' 表达式。

我的代码片段是

public void getFile(Map<String, Object> metaData) throws Exception {
    Criteria criteria = new Criteria();
    metaData.forEach((k, v) -> criteria.andOperator(Criteria.where("metadata." + k).is(v)));
    GridFSDBFile gridFSDBFile = gridFsOperations.findOne(new Query(criteria));
    if (gridFSDBFile == null) {
        throw new HttpConflictException();
}
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc mongodb spring-data-mongodb spring-boot

6
推荐指数
1
解决办法
7165
查看次数

如何在mongodb中连接数字和字符串值?

我需要从 mongodb 的 json 文件中的数组中选择一个值。

json 看起来像这样:

{
    "key" : {
        "subkey" : "value",
        "subkey1" : "value",
        "subkey2" : "value",
        "firstArray" : [ 
            NumberLong(1234),
            "secondIndex"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试选择 firstIndex,我的查询如下所示:

db.getCollection('table_name').aggregate([{
    $project: {
        columnName: {
            $concat: [{
                $substr: ["$key.firstArray[0]"],
                "hello world"
            }
            ]
       }
   }
}])
Run Code Online (Sandbox Code Playgroud)

但这会返回一个空字符串。我不明白为什么。

我尝试的另一件事是使用 $arrayElemAt,它看起来像:

db.getCollection('table_name').aggregate([{
    $project: {
        columnName: {
            $concat: [{
                $arrayElemAt: ["$key.firstArray", 0],
                "hello world"
            }]
       }
   }
}])
Run Code Online (Sandbox Code Playgroud)

但这返回一个 concat 只支持字符串,不支持 NumberLongs。

arrays json concat mongodb aggregation-framework

6
推荐指数
1
解决办法
2697
查看次数

如何从 mongo 聚合查询中的组值中过滤掉空数组元素?

我的总 $group 是:

{
    $group: {
        _id: { ["$dayOfYear"]: "$TagDateCreated" },
        disqualified: {
            $addToSet: {
                $cond: {
                    if: { $in: [ "$TagId", [109,220,115,113,238] ]},
                    then: "$ContactId",
                    else: null
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我一组唯一的 contactId 作为取消资格,但我需要删除空值。我试过在 $project 中省略 $cond 和各种 $filters 中的 else 语句,它们要么不删除任何内容,要么删除所有内容,要么出错。

mongodb aggregation-framework

6
推荐指数
1
解决办法
3795
查看次数

如何使用java在mongodb中仅获取文档的objectId

我只想从具有匹配条件的 mongodb 中获取 objectId。我可以使用 dbobject 和 cursor 方法获取它。但是我在这里使用了 mongo 客户端,但不知道该怎么做。感谢您

    MongoClient client = new MongoClient("localhost", 27017);
    MongoDatabase database = client.getDatabase("baazaronline");
    MongoCollection<Document> collection = database
            .getCollection("Attribute");

    Bson filter = new Document("attcode", attcode);

    Bson newValue = new Document("DefautV", DefautV).append("IVSO", IVSO).append("UniqueV", UniqueV).append("ValuesR", ValuesR).append("Visiblename", Visiblename).append("citso", citso).append("values",values);
    Bson updateOperationDocument = new Document("$set", newValue);
    collection.updateOne(filter, updateOperationDocument);

    client.close();
Run Code Online (Sandbox Code Playgroud)

java mongodb mongodb-java

5
推荐指数
1
解决办法
5504
查看次数

如何使用Java上传mongodb中的json文件?

我正在尝试使用Java将一个大的JSON文件(newclicklogs.json)上传到mongodb.以下是我的JSON文件的样子:

{"preview":false,"result":{"search_term":"rania","request_time":"Sat Apr 01 12:47:04 -0400 2017","request_ip":"127.0.0.1","stats_type":"stats","upi":"355658761","unit":"DR","job_title":"Communications Officer","vpu":"INP","organization":"73","city":"Wash","country":"DC","title":"Tom","url":"www.demo.com","tab_name":"People-Tab","page_name":"PEOPLE","result_number":"5","page_num":"0","session_id":"df234f468cb3fe8be","total_results":"5","filter":"qterm=rina","_time":"2017-04-01T12:47:04.000-0400"}}
{"preview"......}
{"preview"......}
....
Run Code Online (Sandbox Code Playgroud)

这是我的Java代码:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.bson.Document;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class Main {

    public static void main(String[] args) throws IOException {

        String jsonString = FileUtils.readFileToString(new File("data/newclicklogs.json"), "UTF-8");

        Document doc = Document.parse(jsonString);
        List<Document> list = new ArrayList<>();
        list.add(doc);

        new MongoClient().getDatabase("test2").getCollection("collection1").insertMany(list);

    }
}
Run Code Online (Sandbox Code Playgroud)

当我查询我的mongodb集合时,只添加了一个文档.如何将文件中的所有文档添加到mongodb集合中.我是mongodb的新手.任何帮助表示赞赏.

java json mongodb mongodb-java

5
推荐指数
1
解决办法
3631
查看次数

如何将多个标准传递给 Criteria.elemMatch() Api?

我有一种情况,我想在ApielemMatch提供的方法调用中提供 3 个条件org.springframework.data.mongodb.core.query.Criteria

Inventory 集合看起来像这样 -

{
    "_id" : "H-P3NCDST45"
    "booking" : [
    {
        "updateDate" : ISODate("2018-01-29T13:32:03.789Z"),
        "status" : "STARTED",
        "message" : "abc"
    },
    {
        "updateDate" : ISODate("2018-01-29T13:32:04.789Z"),
        "status" : "PENDING",
        "message" : "def"
    },
    {
        "updateDate" : ISODate("2018-01-29T13:33:04.789Z"),
        "status" : "CONFIRMED",
        "message" : "abc"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

我想做类似下面的查询。从inventory集合中获取所有文档,这些文档在booking数组中至少有一个嵌入文档,其状态为“STARTED”并且updateDate介于<start><end>日期之间,即从给定<start><end>日期之间开始/启动的库存中获取所有预订。

db.inventory.find({"booking": { $elemMatch: { status: "STARTED",updateDate: { $gte: ISODate("2018-01-01T14:04:34.447Z"), $lte: ISODate("2018-01-20T14:04:34.447Z")}}}})
Run Code Online (Sandbox Code Playgroud)

标准 Api …

mongodb aggregation-framework spring-data-mongodb

5
推荐指数
1
解决办法
1310
查看次数

将 MongoDB 聚合 $lookup 限制为仅 1 个匹配项

有两个集合,usersreports

我的目标是进行聚合以获取所有用户,并且每个用户都user包含用户的最后一个 report.

这是我目前的聚合:

db.users.aggregate([{
  $lookup: {
    from: 'reports',
    localField: '_id',
    foreignField: 'userId',
    as: 'report',
  },
}, {
  $project: {
    'lastReportAmount': {
      $let: {
        vars: {
          lastReport: {'$arrayElemAt': ['$report', 0]},
        },
        in: '$$lastReport.amount',
      },
    },
    'id': '$_id',
    'name': 1,
    'firstLogin': 1,
    'email': 1,
  },
}])
Run Code Online (Sandbox Code Playgroud)

此查询工作正常,但速度很慢。
这样做的原因是$lookup返回与某个匹配的所有报告userId,而不是一个(最后一个)。

有没有办法限制$lookup只有一场比赛?

mongodb aggregation-framework

5
推荐指数
1
解决办法
2159
查看次数

我如何在 Mongo 上对每天和每小时的数据进行分组?

我必须收集显示访问次数的图表的数据,例如,如果我想在图表中显示一天,我必须除以每小时的访问次数。我的对象是这样的

{
    "_id" : ObjectId("5ab1119b646e371568c8cf9e"),
    "date" : ISODate("2018-03-20T13:46:30.018Z"),
    "__v" : 0
}
Run Code Online (Sandbox Code Playgroud)

我试过这个代码

db.getCollection('monitors').aggregate([{
        "$group": {
            "_id": {
                "year": {"$year": "$date"},
                "dayOfYear": {"$dayOfYear": "$date"},
                "interval": {"$subtract": [{"$minute": "$date"}, {"$mod": [{"$minute": "$date"}, 60]}]}
            }, "count": {"$sum": 1}
        }
    }]))
Run Code Online (Sandbox Code Playgroud)

它可以工作,但它每天只收集数据。我还需要每小时收集一次。多谢。

mongodb mongodb-query aggregation-framework

5
推荐指数
1
解决办法
1190
查看次数