如何在 mongo 存储库中过滤对象数组

Posted

技术标签:

【中文标题】如何在 mongo 存储库中过滤对象数组【英文标题】:How to filter in mongo repository for array of objects 【发布时间】:2019-09-21 23:11:36 【问题描述】:

这里我使用的是 MongoRepository,我需要查询一个对象列表,其中包含对象数组中的某个 id。

文档结构:


 "_id" : ObjectId("5ccc1c54a3d5eed9a6b8015a"),
 "email" : "sineth3@gmail.com",
 "name" : "edward3",
 "businessName" : "aroma3",
 "phone" : "07177222233",
 "address" : "no 100 NY",
 "bookletSignups" : [
    
        "bookletId" : "sample-booklet",
        "contactName" : "john doe"
    ,
    
        "bookletId" : "sample-booklet1",
        "contactName" : "john doe1"
    
 ],
  "eventSignups" : [
    
        "eventId" : "sample-event",
        "contactName" : "john doe2"
    ,
    
        "eventId" : "sample-event 1",
        "contactName" : "john doe3"
    
 ],
  "infoSignups" : [
    
        "infoRequestId" : "sample-info ",
        "contactName" : "john doe4"
    ,
    
        "infoRequestId" : "sample-event 1",
        "contactName" : "john doe5"
    
 ],
  "webinarSignups" : [
    
        "webinarId" : "sample-webinar ",
        "contactName" : "john doe6"
    ,
    
        "webinarId" : "sample-webinar 1",
        "contactName" : "john doe7"
    
 ],
 "updatedTime" : ISODate("2016-03-03T08:00:00Z")

存储库:

@Repository
public interface UserRepository extends MongoRepository<User,String> 

   @org.springframework.data.mongodb.repository.Query(value = " 'bookletSignups':  $elemMatch:  'bookletSignups.bookletId' : ?0  ")
   List<User> findByBookletId(String id);


用户模型类:

@Id
private String id;
private String email;
private String name;
private String businessName;
private String phone;
private String address;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private Date createdTime;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private Date updatedTime;
@Field("bookletSignups")
@DBRef
private List<BookletSignUp> bookletSignups;
@Field("eventSignups")
@DBRef
private List<EventSignUp> eventSignups;
@Field("infoSignups")
@DBRef
private List<InfoSignUp> infoSignups;
@Field("webinarSignups")
@DBRef
private List<WebinarSignUp> webinarSignups;

所以我试图检索包含具有传递 bookletId 值的 bookletSignups 对象的用户对象。但结果是空的。这里出了什么问题?

【问题讨论】:

【参考方案1】:

我会说您需要将查询修改为如下所示:

@Repository
public interface UserRepository extends MongoRepository<User,String> 

   @org.springframework.data.mongodb.repository.Query(value = " 'bookletSignups':  $elemMatch:  'bookletId' : ?0  ")
   List<User> findByBookletId(String id);


如果您查看 MongoDB 文档中的 $elemMatch、link to documentation,您可以看到基本上在 $elemMatch 运算符中您使用的是嵌入对象中的字段,因此您无需再次指定您所在的数组的名称正在搜索对象。

【讨论】:

以上是关于如何在 mongo 存储库中过滤对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongo - 通过_id更新嵌套的对象数组

如何在javascript中将对象数组过滤为另一个对象数组? [关闭]

从 Mongo DB 文档的数组中的对象数组中删除一个值

想要在 Mongo 中更新数组对象值的数组

数组 - Javascript - 使用输入搜索过滤对象数组

如果mongo db中存在/不存在字段,如何向对象添加数组数据