从MongoDB中的嵌套项中提取单个特定元素

时间:2013-09-15 01:58:32

标签: mongodb mongodb-query mongodb-java

我是MongoDB的新手。 我在MongoDB中创建了一个集合并存储了以下

Q1UsefulStatementsList: [{
    Q1UsefulStatement: "Useful Sentence"
    Q1ActionsList: [{
        Q1Verb: "Verb in the sentence"
        Q1NP: "The Noun phrase"
        Q1PP: "The Preposition phrase"
    }]
}]
Q2UsefulStatementsList: [{
    Q2UsefulStatement: "Useful Sentence"
    Q2ActionsList: [{
        Q2Verb: "Verb in the Sentence"
        Q2NP: "The Noun phrase"
        Q2PP: "The preposition Phrase"
    }]
}]

我需要循环遍历此集合并从Q1UsefulStatementsList和Q2UsefulStatementsList获取所有动词。 例如:

Q1UsefulStatementsList: [{
    Q1UsefulStatement: "My dog also likes eating sausage"
    Q1ActionsList: [{
        Q1Verb: "likes"
        Q1NP: "My dog"
        Q1PP: "n / a"
    }]
} {
    Q1UsefulStatement: "The disabling of log helps"
    Q1ActionsList: [{
        Q1Verb: "disabling"
        Q1NP: "disaabling of logs"
        Q1PP: "of"
    }]
}]
Q2UsefulStatementsList: [{
    Q2UsefulStatement: "Log analysis failed"
    Q2ActionsList: [{
        Q2Verb: "failed"
        Q2NP: "Log analysis"
        Q2PP: "n / a"
    }]
}]

我想得到'喜欢'并且'禁用'当我运行Q1UsefulStatementsList时作为输出。

我使用下面的代码尝试过它。但有没有更简单的方法在MongoDB中做这些事情?

我尝试使用'点运算符'喜欢(Q1UsefulStatementsList.Q1UsefulStatement)但它给我的是一个完整的BSON(JSON)对象。我需要的是直接实际的个人价值。

如果有任何建议,请提出建议。

我为提取值而编写的Java代码

if (object.get("Q1UsefulStatementsList") != null) {
    BasicDBList qUseStatementList = (BasicDBList)(object.get("Q1UsefulStatementsList"));

    for (Object qUsefulStatement: qUseStatementList) {
        DBObject tmp = (DBObject) qUsefulStatement;

        if (tmp.get("Q1ActionsList") != null) {
            BasicDBList qActionsList = (BasicDBList) tmp.get("Q1ActionsList");
            for (Object qVerbs: qActionsList) {
                DBObject tmpQVerbs = (DBObject) qVerbs;
                String verb = (tmpQVerbs.get("Q1Verb").toString());
                String nP = (tmpQVerbs.get("Q1NP").toString());
                String pP = (tmpQVerbs.get("Q1PP").toString());

            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架来获取所需的动词。您可以使用以下代码执行此操作。

db.myObject.aggregate(
{ $unwind : "$Q1UsefulStatementsList"},
{ $unwind : "$Q1UsefulStatementsList.Q1ActionsList"},
{$group:{ _id: "$_id", verbs : {$addToSet : "$Q1UsefulStatementsList.Q1ActionsList.Q1Verb"}}}
);

这将返回如下结果:

"result" : [
    {
        "_id" : ObjectId("5253e46ae3a2c44e082642c9"),
        "verbs" : ["disabling", "likes"]
    }
]

通过循环结果数组,您可以提取谓词数组并将其添加到Set中以获得唯一的动词。

您可以轻松将其转换为Java代码。