使用Java中的$ elemMatch实现Mongodb查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java中的$ elemMatch实现Mongodb查询相关的知识,希望对你有一定的参考价值。

我使用Mongo java驱动程序从mongo集合中检索数据。我有以下查询,我试图在java中实现:Json是:

{
    "_id" : ObjectId("56cd284767c74d3d4dd3ec80"),
    "comments" : "Hello",
    "statusLog" : [ 
        {
            "status" : "Submitted",
            "startDate" : ISODate("2015-01-14T05:00:00.000Z"),
            "endDate" : ISODate("2016-02-29T21:24:24.740Z")
        }, 
        {
            "status" : "Active",
            "startDate" : ISODate("2016-02-29T21:24:24.740Z")
        }
    ],
    "createdDate" : ISODate("2015-01-14T05:00:00.000Z")
}

Mongo查询:

db.CollectionName.find({},{_id: 0, createdDate:1, "statusLog": {$elemMatch: {"status":"Submitted"}}});

这是我编写的java中的查询(mongo java driver 3.4.2):

BasicDBObject query = new BasicDBObject(new BasicDBObject("statusLog",
                new BasicDBObject("$elemMatch", new BasicDBObject("status", "Submitted"))));

运行java代码将返回所有状态日志,而不是我要查找的日志。

任何帮助将受到高度赞赏。

答案

您应该使用较新的Document/MongoCollection api并使用辅助方法来准备投影。

import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Projections.*;

MongoClient mongoClient = new MongoClient(); 
MongoDatabase database = mongoClient.getDatabase("db"); // Get DB

MongoCollection<Document> collection = database.getCollection("collection"); // Get Collection
Bson projection = Projections.fields( excludeId(), include("createdDate"), elemMatch("statusLog", eq("status", "Submitted"))); // Add Projections
FindIterable<Document> iterable = collection.find().projection(projection);

使用旧的BasicDBObject/DBCollection api

MongoClient mongoClient = new MongoClient();
DB database = mongoClient.getDB("db");

DBCollection collection = database.getCollection("collection");
BasicDBObject projection = new BasicDBObject(new BasicDBObject("statusLog",new BasicDBObject("$elemMatch", new BasicDBObject("status", "Submitted"))));
collection.find(new BasicDBObject(), projection);
另一答案

接受的答案是错误的。 elemMatch应该在find方法中而不是在投影bson中。例如:

collection.find(elemMatch("statusLog", eq("status", "Submitted"))).projection(projection);

以上是关于使用Java中的$ elemMatch实现Mongodb查询的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在具有 $elemMatch 投影的同一集合上使用查询投影?

可以在同一个查询中使用运算符“$ ne”和“$ elemMatch”吗?

通过 ElemMatch 查询集合类型的字段是否符合某条件转换成 Lambda表达式的形式

MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段

在子元素上使用 elemMatch 进行投影和过滤

如何使用 $elemMatch 查找和过滤并更新数组的所有元素该元素在猫鼬中有一个特殊的日期?