我有一个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?
我试图检索具有特定“_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(代表从 …
我想在 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) 我需要从 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。
我的总 $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 中获取 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将一个大的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的新手.任何帮助表示赞赏.
我有一种情况,我想在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 …
有两个集合,users和reports。
我的目标是进行聚合以获取所有用户,并且每个用户都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只有一场比赛?
我必须收集显示访问次数的图表的数据,例如,如果我想在图表中显示一天,我必须除以每小时的访问次数。我的对象是这样的
{
"_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 ×10
java ×4
spring ×3
json ×2
mongodb-java ×2
arrays ×1
concat ×1
spring-boot ×1
spring-mongo ×1
spring-mvc ×1