【问题标题】:How to get just element of array in Java & MongoDB?如何在 Java 和 MongoDB 中获取数组的元素?
【发布时间】:2021-06-08 16:31:09
【问题描述】:

这是我的 Product MongoDB 集合示例:

product {

sku: abcQWE123,
url: www.xyz.com
comments:[
    "Lorem ipsum dolor sit amet",
    "inceptos himenaeos",
    "viverra. Aenean placerat ex in justo ul"
]

}

如果包含“ipsum”,我只想获得带有“url”的评论。

想象一下,如果数据库有一个上面的条目,我的结果会是这样的:

product{

url: www.xyz.com
comments:[
    "Lorem ipsum dolor sit amet",
]

}

我可以使用下面的命令获取包含“ipsum”的整个条目。但我想具体一点,虽然我不知道该怎么做。你能帮我解决这个问题吗?

public void main(String[] args) {

    MongoCursor<Product> p = mongoDB.getProducts().find(myMongoFilter("comments", "ipsum")).iterator();
    
    try {
        while (p.hasNext()) {
            System.out.println(p.next().toString());
        }
    } finally {
        p.close();
    }

}

public Document myMongoFilter(String myField, String myRegex) {
    return new Document(myField, new Document("$regex", myRegex));
}

【问题讨论】:

  • 您需要其中带有“impsum”的 cmets 和相应的 URL??
  • @KaranGaur 是的,我确实想这样做。

标签: java mongodb mongodb-query


【解决方案1】:

这是我的答案。 @Sumanth229 感谢您提及算法。

public static void main(String[] args) {
    ...
    ...
    List<Document> products = mongoDB.getProductsInRaw().aggregate(Filter.findComments("ipsum")).into(new ArrayList<>());

    products.forEach(document -> System.out.println(document.toJson()));
    ...
    ...
}

public MongoCollection<Products> getProducts() {
    return getDB().getCollection("products", Products.class);
}

public MongoCollection<Document> getProductsInRaw() {
    return getDB().getCollection("products");
}

public static ArrayList<Bson> findComments(String keywords) {
    ArrayList<Bson> queries = new ArrayList<>();
    queries.add(Filter.aggregateContains("comments", keywords));
    queries.add(Filter.aggregateUnwind("comments"));
    queries.add(Filter.aggregateContains("comments", keywords));

    //
    // To access full question's answer, remove comment block.
    // I don't want to use this line because of my requests were changed.
    // queries.add(new Document("$group", new Document("_id", new Document("comments", "$comments").append("url", "$url")).append("count", new Document("$sum", 1))));
    //
    //

    return queries;
}

public static Document aggregateContains(String field, String regex) {
    return new Document("$match", new Document(field, new Document("$regex", regex)));
}

public static Document aggregateUnwind(String field) {
    return new Document("$unwind", "$" + field);
}

【讨论】:

    【解决方案2】:

    您可以使用 mongo 中的投影进行这样的过滤

    import com.mongodb.client.model.Projections;
    
    MongoCursor<Product> p = mongoDB.getProducts()
                                    .find(myMongoFilter("comments", "ipsum"))
                                    .projection(Projections.include("comments", "url"))
                                    .iterator();
    

    【讨论】:

    • 您好,您的贡献与我想看到的完全不符。是的,它掩盖了 SKU 字段,但其他 cmets 不会去任何地方。
    • 您必须展开 cmets 列表,然后使用 MongoDB 聚合对其进行过滤和分组,以仅显示其中包含 ipsum 的 cmets。
    • 如果您有代码解决方案,可以与我分享吗?顺便说一下,谢谢分享算法,我去搜一下怎么做。
    猜你喜欢
    • 2019-06-15
    • 2021-10-29
    • 1970-01-01
    • 2016-09-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多