我在 mongodb 文档中找到了这个 mongo 命令:
db.sales.aggregate(
[
{
$group : {
_id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
使用 spring 数据的聚合时,很容易通过调用 Aggregation.group(Feild ...) 将一个 Document 属性绑定到 $group 中的 _id
但是对于上述情况,_id 属性被组合在一起,我未能在 Java 中构建它。各位大侠有解决办法吗???我的意思是如何用Java表达上面的js??
非常感谢...
@update ..... $group 的 _id 使用 mongo 函数,如 $month …
java mongodb spring-mongo mongodb-query aggregation-framework
我尝试使用 Spring Data REST 和 MongoDB 实现基于位置的搜索。首先我创建了一个模型。
public class Event {
@Id
private String id;
private String name;
private String description;
private double[] position;
.. getter setter ..
}
Run Code Online (Sandbox Code Playgroud)
其次,我添加了一个存储库。
public interface EventRepository extends MongoRepository<Event, String> {
List<Event> findByName(@Param("name") String name);
List<Event> findByPositionWithin(@Param("circle") Circle c);
List<Event> findByPositionNear(@Param("point") Point p, @Param("distance") Distance d);
}
Run Code Online (Sandbox Code Playgroud)
但是现在我遇到了我不知道如何为findByPositionWithin和findByPositionNear调用/search端点的问题?我找不到任何关于如何将复杂类型传递给方法的参考文献或文档。
findByName 端点events/search/findByName?name=test运行良好。如何传递 circle 参数?我需要编写自定义消息转换吗?
希望有人有任何建议:)
要直接,我该怎么做:
group._id = {
year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] },
month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] },
day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
};
Run Code Online (Sandbox Code Playgroud)
用spring数据
我已经尝试了这个和其他一些形式并没有成功
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(c),
Aggregation.project("programa", "custo", "duracao", "dataHora")
.andExpression("dataHora").minus(25200000).extractDayOfMonth().as("dia")
.andExpression("dataHora").minus(25200000).extractMonth().as("mes")
.andExpression("dataHora").minus(25200000).extractYear().as("ano"),
Aggregation.group("programa", "ano", "mes", "dia")
.count().as("count")
.sum("custo").as("valorTotal")
.sum("duracao").as("duracaoTotal")
.first("dataHora").as("dataHora"),
Aggregation.sort(Direction.ASC, "dataHora")
);
Run Code Online (Sandbox Code Playgroud)
我需要在mongodb中按天,月和年进行分组,否则我需要在代码中转换所有这些分组数据.
提前致谢
java mongodb spring-mongo mongodb-query aggregation-framework
我正在使用Spring数据mongo向Mongo插入一条记录,
这是我的代码mongoTemplate.save(person,“ personCollection”);
这是我的人对象
public class Person implements Serializable {
int age;
String address;
String name;
//Getters and setters including hashcode and equals
}
Run Code Online (Sandbox Code Playgroud)
我的地址在此处为null,在将记录插入集合中之后,仅使用年龄和姓名填充数据
我知道mongodb将null值和noKey视为同一个东西,但是我的要求是甚至填充address:null以使架构保持一致如何使用Spring Data mongo做到这一点
当前o / p:{“ age”:21,“ name”:“ john Doe”}
预期的o / p:{“ age”:21,“ name”:“ john Doe”,“ address”:null}
在 Spring Data JPA 中,我们有规范,并且可以使用规范进行分页和排序。
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);
List<T> findAll(Specification<T> var1);
Page<T> findAll(Specification<T> var1, Pageable var2);
List<T> findAll(Specification<T> var1, Sort var2);
long count(Specification<T> var1);
}
Run Code Online (Sandbox Code Playgroud)
但在 MongoRepository 中无法使用此类功能。我尝试使用 QueryByExampleExecutor,但它非常有限 例如我想要过滤年份 >5 和 <20 的数据怎么办?但我想动态生成查询
我正在尝试在我的项目中使用枚举,并且需要使用小写而不是大写将它们保存在 mongoDB 集合中。
我有一个带有值 String 字段的枚举和用 Jackson 的@JsonCreator和注释的 setter/getters @JsonValue。
public enum State {
GREEN ("vert"),
ORANGE ("orange"),
RED ("rouge");
private final String value;
State(String val) {
this.value = val;
}
@JsonCreator
public static State fromValue(String value) {
if (value != null) {
for (State state : values()) {
if (state.value.equals(value)) {
return state;
}
}
}
throw new IllegalArgumentException("Invalid state: " + value);
}
@JsonValue
public final String toValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个使用这个枚举的类,如下所示:
@Document(collection …Run Code Online (Sandbox Code Playgroud) 我在 mongo 文档中有 json 对象,例如:
{
"_id" : "tuneeca_z_0915002",
"variants" : [
{
"name" : "Z-0915002-Beige-S",
"id" : "tuneeca_z_0915002_tuneeca_beige_base_s_size",
"barCode" : "00017311"
},
{
"name" : "Z-0915002-Beige-XS",
"id" : "tuneeca_z_0915002_tuneeca_beige_base_xs_size",
"barCode" : "00017312"
},
{
"name" : "Z-0915002-Beige-M",
"id" : "tuneeca_z_0915002_tuneeca_beige_base_m_size",
"barCode" : "00017313"
},
{
"name" : "Z-0915002-Beige-L",
"id" : "tuneeca_z_0915002_tuneeca_beige_base_l_size",
"barCode" : "00017314"
},
{
"name" : "Z-0915002-Beige-XL",
"id" : "tuneeca_z_0915002_tuneeca_beige_base_xl_size",
"barCode" : "00017315"
}
],
"name" : "Z-0915002",
"localSku" : "Z-0915002",
"release" : {
"id" : "tuneeca_premium", …Run Code Online (Sandbox Code Playgroud) 我正在使用自定义查询来选择使用findDistinct方法的字段。我尝试使用with方法将pageRequest传递给查询,但仍然得到了完整的结果。有什么办法可以将findDistinct的结果分页吗?
Query query = new Query();
query.addCriteria(Criteria.where("socialAction").in(socialActions));
query.addCriteria(Criteria.where("userId").is(userId));
if (excludedSubjectIds != null) {
query.addCriteria(Criteria.where("subjectId").nin(excludedSubjectIds));
}
PageRequest pageRequest = PageRequest.of(0, 15);
query.with(pageRequest);
List<String> subjectId = mongoTemplate.findDistinct(query, "subjectId", SocialUserHistory.class, String.class);
Run Code Online (Sandbox Code Playgroud)
我期望有15个subjectId,但是目前我正在获取所有的subjectId。
这是实体:
@Document
@Data
public class ApplicationUser {
private String name;
@Indexed(unique = true)
private String email;
private String organization = null;
// other fields
}
Run Code Online (Sandbox Code Playgroud)
我使用他们的电子邮件获取该用户,然后更改他们的姓名。我使用ApplicationUserRepository的自动装配实例。
ApplicationUser applicationUser = applicationUserRepository.findByEmail("abc@gmail.com");
applicationUser.setName("John Doe 2");
Run Code Online (Sandbox Code Playgroud)
然后我尝试在数据库中再次更新这个实体:
applicationUserRepository.save(applicationUser);
Run Code Online (Sandbox Code Playgroud)
我在现场电子邮件中收到重复的密钥错误。为什么会这样?据我从文档中获得,如果 ObjectId 相同,save方法会更新同一个文档。既然我没有更改 objectId 那么为什么它在保存期间尝试创建一个新的 ApplicationUser ?
我有这些收藏
采购订单
{
"_id": "5f0104a8d0c3a06fc9c06625",
"purchaseItems": [
{
"product": "5eff29e9e2708a0ca980762e",
"quantity": 1
},
{
"product": "5eff29e9e2708a0ca980762e",
"quantity": 2
}
],
"totalQuantity": 0,
"documentDate": {
"$date": "2020-07-04T16:00:00.000Z"
}
}
Run Code Online (Sandbox Code Playgroud)
和
产品
{
"_id": "5eff29e9e2708a0ca980762e",
"name": "name",
"code": "code",
"cost": "1",
"srp": "1",
"minimum": "1",
"startEffectiveDate": {
"$date": "2020-07-04T16:00:00.000Z"
}
}
Run Code Online (Sandbox Code Playgroud)
如何将 buyItems 中的产品字段加入到产品集合中,该购买项目是一个嵌入式数组文档。我需要这样的东西。
{
"_id": "5f0104a8d0c3a06fc9c06625",
"purchaseItems": [
{
"product": {
"_id": "5eff29e9e2708a0ca980762e",
"name": "product name"
},
"quantity": 1
},
{
"product": {
"_id": "5eff29e9e2708a0ca980762e",
"name": "product name 2"
},
"quantity": …Run Code Online (Sandbox Code Playgroud) lookup mongodb spring-mongo mongodb-query aggregation-framework
spring-mongo ×10
java ×5
mongodb ×5
spring-boot ×3
spring-data ×3
spring ×2
jackson ×1
json ×1
lookup ×1
spring-batch ×1