簡體   English   中英

過濾孩子的標簽字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM