英文:
MongoDB array aggregation create new document query
问题
I want to clarify that you'd like a Chinese translation of the code and the text you provided, but without answering the specific translation request in your content. Here is the translated code and text:
我有这个数组集合:
{
"_id": 154,
"title": "title1",
"authors": [ { "name": "John Smith", "registered": true },
{ "name": "Jane Doe", "registered": true },
],
"tags": [ "tag1", "tag2", "tag3" ]
}
使用mongodb聚合,我想生成以下输出:
{
"tag": "tag1",
"titles": [ "title1", "title2", "title3"],
"size": 3
},
{
"tag": "tag2",
"titles": [ "title3", "title4" ],
"size": 2
}
每个标签都应该以tag键呈现。
我想找到其他文档中存在的所有标签,以便我可以创建单独的标题数组,最后size应该显示标题的长度。
我正在使用此查询,但未获得所需的输出
db.posts.aggregate([{$match:{"authors":{$all:[{$elemMatch:{registered:true}}]}}},{$unwind:"$tags"},{$project:{tag:"$tags",size:{$size:"$authors"},_id:0}}])
有人能帮我编写所需的查询吗?
我还尝试过
db.posts.aggregate([{$match:{"authors":{$all:[{$elemMatch:{registered:true}}]}}},{$unwind:"$tags"},{$project:{tag:"$tags",size:{$size:"$authors"},_id:0}}])
但是我没有得到所需的结果。
This translation includes the code and text you provided in Chinese.
英文:
I have this array collection with
{
"_id": 154,
"title": "title1",
"authors": [ { "name": "John Smith", "registered": true },
{ "name": "Jane Doe", "registered": true },
],
"tags": [ "tag1", "tag2", "tag3" ]
}
By using mongodb aggregation, I want to generate output like this
{
"tag": "tag1",
"titles": [ "title1", "title2", "title3"],
"size": 3
},
{
"tag": "tag2",
"titles": [ "title3", "title4" ],
"size": 2
}
Each tag should present with tag key.
I want to find all the tags which exists in other documents so that I can create separate array of titles, and at the very last size should show the length of the titles.
I am using this query, but I'm not getting the desired output
db.posts.aggregate([{$match:{"authors":{$all:[{$elemMatch:{registered:true}}]}}},{$unwind:"$tags"},{$project:{tag:"$tags",size:{$size:"$authors"},_id:0}}])
Can someone help me write the desired query?
I also tried
db.posts.aggregate([{$match:{"authors":{$all:[{$elemMatch:{registered:true}}]}}},{$unwind:"$tags"},{$project:{tag:"$tags",size:{$size:"$authors"},_id:0}}])
but I'm not getting desired result.
答案1
得分: 0
I think you may need the $group
operator. Are you looking for something like this?
db.collection.aggregate([
{
$match: {
"authors": {
$all: [
{
$elemMatch: {
registered: true
}
}
]
}
}
},
{
$unwind: "$tags"
},
{
$group: {
_id: "$tags",
titles: {
"$addToSet": "$title"
}
}
},
{
$project: {
_id: 0,
tag: "$_id",
titles: 1,
size: {
$size: "$titles"
}
}
}
])
Given your sample document of:
{
"_id": 154,
"title": "title1",
"authors": [
{
"name": "John Smith",
"registered": true
},
{
"name": "Jane Doe",
"registered": true
}
],
"tags": [
"tag1",
"tag2",
"tag3"
]
}
The output is:
[
{
"size": 1,
"tag": "tag2",
"titles": [
"title1"
]
},
{
"size": 1,
"tag": "tag3",
"titles": [
"title1"
]
},
{
"size": 1,
"tag": "tag1",
"titles": [
"title1"
]
}
]
If I add another document of:
{
"_id": 153,
"title": "title2",
"authors": [
{
"name": "John Smith",
"registered": true
},
{
"name": "Jane Doe",
"registered": true
}
],
"tags": [
"tag1",
"tag3",
"tag4"
]
}
Then the output is:
[
{
"size": 1,
"tag": "tag4",
"titles": [
"title2"
]
},
{
"size": 2,
"tag": "tag3",
"titles": [
"title1",
"title2"
]
},
{
"size": 2,
"tag": "tag1",
"titles": [
"title1",
"title2"
]
},
{
"size": 1,
"tag": "tag2",
"titles": [
"title1"
]
}
]
Playground demonstration here.
英文:
I think you may need the $group
operator. Are you looking for something like this?
db.collection.aggregate([
{
$match: {
"authors": {
$all: [
{
$elemMatch: {
registered: true
}
}
]
}
}
},
{
$unwind: "$tags"
},
{
$group: {
_id: "$tags",
titles: {
"$addToSet": "$title"
}
}
},
{
$project: {
_id: 0,
tag: "$_id",
titles: 1,
size: {
$size: "$titles"
}
}
}
])
Given your sample document of:
{
"_id": 154,
"title": "title1",
"authors": [
{
"name": "John Smith",
"registered": true
},
{
"name": "Jane Doe",
"registered": true
},
],
"tags": [
"tag1",
"tag2",
"tag3"
]
}
The output is:
[
{
"size": 1,
"tag": "tag2",
"titles": [
"title1"
]
},
{
"size": 1,
"tag": "tag3",
"titles": [
"title1"
]
},
{
"size": 1,
"tag": "tag1",
"titles": [
"title1"
]
}
]
If I add another document of:
{
"_id": 153,
"title": "title2",
"authors": [
{
"name": "John Smith",
"registered": true
},
{
"name": "Jane Doe",
"registered": true
},
],
"tags": [
"tag1",
"tag3",
"tag4"
]
}
Then the output is:
[
{
"size": 1,
"tag": "tag4",
"titles": [
"title2"
]
},
{
"size": 2,
"tag": "tag3",
"titles": [
"title1",
"title2"
]
},
{
"size": 2,
"tag": "tag1",
"titles": [
"title1",
"title2"
]
},
{
"size": 1,
"tag": "tag2",
"titles": [
"title1"
]
}
]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论