{
"_id" : ObjectId("577b54816081dd32cd3e2d60"),
"user" : ObjectId("577b54816081dd32cd3e2d5e"),
"journals" : [
{
"title" : "Journal Title2",
"desc" : "desx2",
"feeling" : 3,
"date" : ISODate("2016-07-05T06:32:45.404Z"),
"deleteFl" : true,
"_id" : ObjectId("577b548d6081dd32cd3e2d64")
},
{
"title" : "Journal Title3",
"desc" : "desx3",
"feeling" : 3,
"date" : ISODate("2016-07-05T06:49:00.156Z"),
"deleteFl" : false,
"_id" : ObjectId("577b585c6081dd32cd3e2d6d")
},
{
"title" : "Journal Title4",
"desc" : "desx4",
"feeling" : 3,
"date" : ISODate("2016-07-05T06:49:06.700Z"),
"deleteFl" : false,
"_id" : ObjectId("577b58626081dd32cd3e2d70")
}
]
}
以上是我的文档结构
现在,我需要所有日志文件,其deleteFl = false。
我尝试使用Java Mongo驱动程序
getDatabase().getCollection("journals").find(and(eq("user", user), eq("journals.deleteFl", false)));
但它还是给了我所有文件,包括“deleteFl”:true。这里有什么帮助吗?
答案 0 :(得分:0)
实际上,您的查询返回1个文档,因为数据位于1个文档中。你想要的是限制文档的返回字段(限制子文档)。
注意:您可以使用投影中的elemMatch来执行此操作,以限制查询返回的字段。但elemMatch只返回一个子文档。 (我使用elemMatch发布了删除的错误答案)
如果需要所有子文档和数组内的特定子文档,则需要使用聚合管道。 这是一个经过测试的代码,可以执行您想要的操作(只需更改DB和colelction名称):
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection collection = db.getCollection("test");
Iterable<Document> output = collection.aggregate(asList(
new BasicDBObject("$unwind", "$journals"),
new BasicDBObject("$match", new BasicDBObject("journals.deleteFl", false))
));
for (Document dbObject : output)
{
System.out.println(dbObject);
}