【问题标题】:Implementing Mongodb query using $elemMatch in Java在 Java 中使用 $elemMatch 实现 Mongodb 查询
【发布时间】:2017-05-19 17:18:07
【问题描述】:

我正在使用 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 代码会返回所有状态日志,而不是我要查找的日志。

任何帮助将不胜感激。

【问题讨论】:

  • 请再次查看答案 - 我现在添加了评论。谢谢

标签: java mongodb mongodb-query mongo-java-driver


【解决方案1】:

elemMatch 应该在 find 方法中,而不是在投影 bson 中。例如:

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

【讨论】:

  • 这个答案不正确 - 它只检查是否存在状态为已提交的状态日志并返回整个文档。在投影中使用 elemmatch 将状态日志限制为仅返回匹配的元素。更多$elemMatch in projection - 与$elemMatch in query比较
【解决方案2】:

您应该使用较新的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);

【讨论】:

    【解决方案3】:
    • 使用多个过滤条件在包含多个对象的文档列表中查找项目:

      “array_of_data”:{$elemMatch:{“AAA”:“xxxx”,“BBB”:“xxxxx”}}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多