gpt4 book ai didi

java - 从数组 MongoDB 获取唯一 ObjectId 的计数

转载 作者:太空宇宙 更新时间:2023-11-04 10:43:58 25 4
gpt4 key购买 nike

我是 MongoDb 的新手,对很多事情都不了解。我需要写一个聚合请求。这是 JSON 文档结构。

{ 
"_id" : ObjectId("5a72f7a75ef7d430e8c462d2"),
"crawler_id" : ObjectId("5a71cbb746e0fb0007adc6c2"),
"skill" : "stack",
"created_date" : ISODate("2018-02-01T13:19:03.522+0000"),
"modified_date" : ISODate("2018-02-01T13:22:23.078+0000"),
"connects" : [
{
"subskill" : "we’re",
"weight" : NumberInt(1),
"parser_id" : [
ObjectId("5a71d88d5ef7d41964fbec11")
]
},
{
"subskill" : "b1",
"weight" : NumberInt(2),
"parser_id" : [
ObjectId("5a71d88d5ef7d41964fbec11"),
ObjectId("5a71d88d5ef7d41964fbec1b")
]
},
{
"subskill" : "making",
"weight" : NumberInt(2),
"parser_id" : [
ObjectId("5a71d88d5ef7d41964fbec1b"),
ObjectId("5a71d88d5ef7d41964fbec1c")
]
},
{
"subskill" : "delivery",
"weight" : NumberInt(2),
"parser_id" : [
ObjectId("5a71d88d5ef7d41964fbec1c"),
ObjectId("5a71d88d5ef7d41964fbec1e")
]
}
]
}

我需要结果返回技能名称和唯一parser_id的数量。在这种情况下,结果应该是:

[
{
"skill": "stack",
"quantity": 4
}
]

其中“stack”-技能名称,和“数量”- 唯一 parser_id 的计数。

ObjectId("5a71d88d5ef7d41964fbec11")
ObjectId("5a71d88d5ef7d41964fbec1b")
ObjectId("5a71d88d5ef7d41964fbec1c")
ObjectId("5a71d88d5ef7d41964fbec1e")

有人可以帮我解决这个请求吗???

最佳答案

鉴于您的问题中提供的文档,此命令...

db.collection.aggregate([
{ $unwind: "$connects" },

// count all occurrences
{ "$group": { "_id": {skill: "$skill", parser_id: "$connects.parser_id"}, "count": { "$sum": 1 } }},

// sum all occurrences and count distinct
{ "$group": { "_id": "$_id.skill", "quantity": { "$sum": 1 } }},

// (optional) rename the '_id' attribute to 'skill'
{ $project: { 'skill': '$_id', 'quantity': 1, _id: 0 } }
])

...将返回:

{
"quantity" : 4,
"skill" : "stack"
}

以上命令按skill分组和connects.parser_id然后获得这些组的不同计数。

您的命令包括 java标签,所以我怀疑您正在寻找使用 MongoDB Java 驱动程序执行相同的命令。下面的代码(使用 MongoDB Java 驱动程序 v3.x)将返回相同的结果:

MongoClient mongoClient = ...;

MongoCollection<Document> collection = mongoClient.getDatabase("...").getCollection("...");

List<Document> documents = collection.aggregate(Arrays.asList(
Aggregates.unwind("$connects"),
new Document("$group", new Document("_id", new Document("skill", "$skill").append("parser_id", "$connects.parser_id"))
.append("count", new Document("$sum", 1))),
new Document("$group", new Document("_id", "$_id.skill").append("quantity", new Document("$sum", 1))),
new Document("$project", new Document("skill", "$_id").append("quantity", 1).append("_id", 0))
)).into(new ArrayList<>());

for (Document document : documents) {
logger.info("{}", document.toJson());
}

注意:此代码特意使用 new Document(<pipeline aggregator>, ...) 形式而不是 Aggregators实用程序,让您更容易查看 shell 命令与其 Java 等效命令之间的转换。

关于java - 从数组 MongoDB 获取唯一 ObjectId 的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com