[英]Filter on tag-field on children
首先,我不確定我是否按照應有的方式進行了設置,就像書中那樣。 我來自 SQL 世界並進入了 NOSQL 領域。
好的,所以。 我有這個項目集合,在項目中我有文件作為子引用。 我可以填充所有這些東西,效果非常好。 但我想用標簽過濾。 我在 File 集合中有一個 tags 字段,一個帶有字符串的數組,非常簡單。
我想做的是; 發送一個 projectId 和一個帶有規范過濾器的字符串,並獲取屬於項目並包含標簽的文件。 哦,還有,人口稠密。
這甚至是使用 NOSQL/MONGO 的正確方法嗎? 我知道我將如何在 SQL 中使用 parent_id 和一些連接等來完成它。我已經研究了一些聚合,但我似乎太新手了,無法解決它。
編輯,只是為了展示我的收藏是如何構建的:
項目集
[{
id: 1,
name: 'Project01',
files: [
id: 1,
id: 2,
id: 3,
id: 4,
id: 5,
...
]
},
...
]
檔案收集
[{
id: 1,
name: 'filename'
tags: ['a','b']
},{
id: 2,
name: 'filename2'
tags: ['b', 'c']
},{
id: 3,
name: 'filename3'
tags: ['a', 'd', 'e', 'f']
},
...]
我要的結果(獲取項目 1 中標簽包含“b”的所有文件。
{
id: 1,
name: 'Project01',
files: [
{
id: 1,
name: 'filename'
tags: ['a','b']
},{
id: 2,
name: 'filename2'
tags: ['b', 'c']
}
]
}
根據您的要求在 mongodb Collections 中嘗試此$unwind
操作
[
{
_id: 1,
name: "Project01",
files: [
{
id: 1,
name: "filename11",
tags: [
"a",
"b"
]
},
{
id: 2,
name: "filename12",
tags: [
"b",
"c"
]
},
{
id: 3,
name: "filename13",
tags: [
"a",
"c"
]
}
]
},
{
_id: 2,
name: "Project02",
files: [
{
id: 1,
name: "filename21",
tags: [
"a",
"b"
]
},
{
id: 2,
name: "filename22",
tags: [
"a",
"c"
]
},
{
id: 3,
name: "filename23",
tags: [
"b",
"c"
]
}
]
}
]
方法一:為你的項目收藏
db.collection.aggregate([
{
$match: {
_id: 1
}
},
{
$unwind: "$files"
},
{
$match: {
_id: 1,
"files.tags": {
$in: [
"b"
]
}
}
}
])
文件收集方法二
db.collection.aggregate([
{
$unwind: "$tags"
},
{
$match: {
tags: "xyz"
}
}
])
在這里嘗試一下Mongoplayground
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.