mongodb根据父文档的搜索结果选择子文档

时间:2016-10-12 21:19:33

标签: java mongodb mongodb-java

我有一个chats收集女巫样本文件

{
    "_id" : ObjectId("57f95e8e385bb61c5cf2cd18"),
    //some other fields
    "messages" : [
            {
                    "sender" : "57ec1aaa0ffe16123439d52b",
                    "message" : "Hello!",
                    "sentTime" : "Oct 13, 2016 1:51:31 AM"
            },
            {
                    "sender" : "57ec1aaa0ffe16123439d52b",
                    "message" : "Hello!",
                    "sentTime" : "Oct 13, 2016 1:51:33 AM"
            }
    ]
}

我想在_id字段的基础上搜索集合,并且只使用MongoDB的java驱动程序获取messages sub-document的数据作为查询结果,因为我想使用Gson映射到POJO数组

期望的输出:

[
        {
                "sender" : "57ec1aaa0ffe16123439d52b",
                "message" : "Hello!",
                "sentTime" : "Oct 13, 2016 1:51:31 AM"
        },
        {
                "sender" : "57ec1aaa0ffe16123439d52b",
                "message" : "Hello!",
                "sentTime" : "Oct 13, 2016 1:51:33 AM"
        }
]

如何使用MongoDB的Java驱动程序

2 个答案:

答案 0 :(得分:0)

我们需要指定查询和字段列表,以下是如何执行此操作的示例:

DB db = //get db

DBObject object = new BasicDBObject();
object.put("_id", new ObjectId("<some id>"));
DBObject fields = new BasicDBObject();
fields.put("messages", 1);
DBObject result = db.getCollection("test").findOne(object, fields);
System.out.println(result.get("messages"));

答案 1 :(得分:0)

也许它有点难看,但它会起作用。

chats.aggregate(Arrays.asList(
    match(eq("_id", <your id here> )),
    unwind("$messages"),
    project(fields(excludeId(), 
                   computed("sender", "$messages.sender"), 
                   computed("message", "$messages.message"),
                   computed("sentTime", "$messages.sentTime")))
    )).forEach(printBlock);

printBlock只打印出每个文档(你可以将它们收集到那里的数组中)。

    Block<Document> printBlock = new Block<Document>() {
        @Override
        public void apply(final Document document) {
            System.out.println(document.toJson());
        }
    };