【问题标题】:Retrieve only the value of an arrays sub-document field using MongoDB Java使用 MongoDB Java 仅检索数组子文档字段的值
【发布时间】:2021-01-07 02:20:51
【问题描述】:

我有一个数据库:

{
"_id": {
    "$oid": "1"
},
"lastName": {
    "lastName": "James"
},
"data": [{
    "day": "20-09-2020 11:35:02",
    "hoursWorked": "0 hours : 5 mins : 321 secs"
}, {
    "day": "20-09-2020 11:35:29",
    "hoursWorked": "0 hours : 5 mins : 321 secs"
}]
}

如何仅检索“数据”字段的子字段“hoursWorked”的值。 所以,我只需要该字段的值或所有值,0 小时:5 分钟:321 秒。

我使用以下内容;但是,我仍然无法检索该值。

Document document = collection
                .find(new BasicDBObject("_id", y))
                .projection(Projections.fields(Projections.include("data.hoursWorked"), excludeId())).first();
        System.out.println(document);
        }

【问题讨论】:

    标签: java mongodb mongodb-java


    【解决方案1】:

    你可以使用投影$project

    db.collection.aggregate([
      {
        $project: {
          "data.hoursWorked": 1
        }
      }
    ])
    

    工作Mongo playground

    在 Spring Boot 中,您需要自动装配 mongoTemplate

    @Autowired
    MongoTemplate mongoTemplate;
    

    聚合代码,

    public List<Object> test(){
        Aggregation aggregation = Aggregation.newAggregation(
            a-> new Document("$project",
                    new Document("data.hoursWorked",1)
            )
    
        ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
    
        return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();
    }
    

    更新 1

    使用 Bson.Doument

    Document nodes = (Document) collection
                    .find(new BasicDBObject("_id", "1"))
                    .projection(Projections.fields(Projections.include("data.hoursWorked"), Projections.excludeId()))
                    .first();
    
            List<Document> list = (List<Document>) nodes.get("data");
            for(Document d:list){
                System.out.println(d.get("hoursWorked"));
            }
    

    【讨论】:

    • 感谢您的回答。我用我的解决方案编辑了帖子,但它仍然不是我需要的。你使用弹簧。有没有办法不使用 Spring?
    • 啊,是的,有办法。你试过tutorialspoint.com/explain-java-mongodb-projections
    • 我的解决方案给了我这个:Document{{data=[Document{{hoursWorked=0 hours : 5 mins : 321 secs}}, Document{{hoursWorked=0 hours : 5 mins : 321 secs} }]}}
    • 该链接的解决方案给了我这个: Document{{_id=5f5723aa557acc1651e56622, data=[Document{{hoursWorked=0 hours : 5 mins : 321 secs}}, Document{{hoursWorked=0小时:5 分钟:321 秒}}]}}。问题:如何仅检索“hoursWorked”字段?
    • FindIterable&lt;Document&gt; documents= // your query. MongoCursor&lt;Document&gt; iterator = documents.iterator(); List&lt;String&gt; list=new ArrayList&lt;&gt;(); while (iterator.hasNext()) { Document nextDocument = iterator.next(); list.add(nextDocument.get("hoursWorked")); } list.forEach(System.out::println);
    【解决方案2】:

    使用 MongoDB Java 驱动程序:

    List<Bson> pipeline = 
        Arrays.asList(
            project(
                 fields(
                     excludeId(), 
                     computed("hoursWorked", 
                          eq("$reduce", 
                              and(eq("input", "$data"), eq("initialValue", Arrays.asList()),
                                  eq("in", eq("$concatArrays", Arrays.asList("$$value", Arrays.asList("$$this.hoursWorked") ) ) ) 
                              ) 
                          ) 
                      ) 
                  )
              ),
             unwind("$hoursWorked")
        );
    
    collection.aggregate(pipeline)
                 .into(new ArrayList<Document>())
                 .forEach(doc -> System.out.println(doc.get("hoursWorked")));
    

    data 数组中打印两个值:

    0 hours : 5 mins : 321 secs
    0 hours : 5 mins : 322 secs
    

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2015-05-25
      • 2023-03-05
      相关资源
      最近更新 更多