Mongodb的 mongoTemplate 内嵌文档怎么进行查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb的 mongoTemplate 内嵌文档怎么进行查询?相关的知识,希望对你有一定的参考价值。
这是我的数据结构--三层;通过第一层zcxx01=che 能查询到所有的数据
但是 通过 第三层 goodsCode=8888888 就不能用这个方法了??
这是我写的 zcxx01能查询,我想要的是 怎么通过goodsCode来查询所有。我改怎么写,求救啊
2
3
4
5
Criteria criteria = new Criteria().andOperator(
Criteria.where("createDate").gte(dateFormat.parseObject("2014-10-01 00:00:00")),
Criteria.where("createDate").lt(dateFormat.parseObject("2014-11-01 00:00:00"))
);
mongoTemplate.group(criteria, "collectionName", new GroupBy("GroupField"), entityClass);
1
2
3
4
5
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.3</version>
</dependency>
MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate
【中文标题】MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate【英文标题】:MongoDB $addFields using org.springframework.data.mongodb.core.MongoTemplate 【发布时间】:2019-03-21 14:13:06 【问题描述】:如何在 Spring Data MongoDB Reactive 中编写 $addFields
查询以获得更简单和稍微复杂的字段添加,如下所示:
db.getCollection("mycollection").aggregate(
[
"$addFields" :
"existingObjectField.newFieldArray" : [
"$existingObjectField.existingFieldObject"
]
,
"$addFields" :
"existingFieldArray" :
"$map" :
"input" : "$existingFieldArray",
"as" : "item",
"in" :
"existingFieldObject" :
"_id" : "$$item. existingFieldObject._id",
"newFieldArray" : [
"$$item. existingFieldObject.existingFieldObject"
]
,
"$out" : "mycollection"
]
);
在第一个添加字段中,我只是使用现有对象字段之一创建一个新数组字段。
在第二个添加字段中,做同样的事情,但在文档的数组中的一个对象内。
【问题讨论】:
【参考方案1】:像match/unwind
一样,spring data mongo
中不存在 AddFieldOperation 但您可以编写自己的类以及custom Aggregation
类来将调用方方法添加到addFieldOpration
,如下所示。
public class AddFieldOperation implements AggregationOperation
private final Document document;
/**
* Creates a new @link MatchOperation for the given @link CriteriaDefinition.
*
* @param criteriaDefinition must not be @literal null.
*/
public AddFieldOperation(final Document document)
Assert.notNull(document, "Criteria must not be null!");
this.document = document;
/*
* (non-Javadoc)
*
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.
* springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override
public Document toDocument(final AggregationOperationContext context)
return new Document("$addFields", this.document);
现在制作 CustomAggregation 类。
public class CustomAggregation extends Aggregation
public static AddFieldOperation addField(final Document document)
return new AddFieldOperation(document);
一切准备就绪,您需要调用Addfield
方法并传递 Document 对象示例中的所有查询:-
AddFieldOperation addField =
CustomAggregation.addField(new Document().append("fieldName", fieldValue));
注意Document
类来自import package org.bson.Document
;
将文档表示为 @code Map。
在spring data mongo
中实现的所有聚合操作最终都转换为 Document 对象,这将在 shell 中执行。因此,如果某些聚合管道尚未在 spirng data
中实现,在这种情况下,我们可以编写自己的并传递用 mongo shell 编写的查询,我们可以将其传递到 Document 对象中。
【讨论】:
我们要向其附加字段的new Document()
是什么?我想对整个集合运行我的查询。
我明白org.bson.Document
是什么。我的意思是问new Document()
在这里的上下文价值是什么。您能否将value
的第一个添加字段existingObjectField.newFieldArray
和第二个添加字段existingFieldArray
(在我的MongoDB 查询中)的部分放在您的示例中进行演示?以上是关于Mongodb的 mongoTemplate 内嵌文档怎么进行查询?的主要内容,如果未能解决你的问题,请参考以下文章
没有名为“mongoTemplate”的 bean 可用。 Spring Boot + MongoDB
MongoDB Lifecycle 事件访问 MongoTemplate