簡體   English   中英

在MongoDB加入多個collections

[英]Join multiple collections in MongoDB

問候朋友我有一個問題與在 MongoDb 中加入多個集合有關我有如下的集合架構

Posts Collection
{
    "type": "POST_TYPE",    
    "_id": "63241dffb0f6770c23663230",
    "user_id": "63241dffb0f6770c23663230",
    "post_id": "63241dffb0f6770c23663230",
    "likes": 50
}
Post Types: 1. Event
{
    "date": "2022-09-16T07:07:18.242+00:00",    
    "_id": "63241dffb0f6770c23663230",
    "user_id": "63241dffb0f6770c23663230",
    "venue": "Some Place",
    "lat": "null",
    "long": "null",
}
Post Types: 2. Poll
{
    "created_date": "2022-09-16T07:07:18.242+00:00",    
    "_id": "63241dffb0f6770c23663230",
    "user_id": "63241dffb0f6770c23663230",
    "question": "Question??????",
    "poll_opt1": "Yes",
    "poll_opt2": "No",
    "poll_opt1_count": "5",
    "poll_opt2_count": "2"
}

現在我必須加入 Post collection 和各自的收藏,例如

"post_id" to Event::_id or Poll::_id with condition to Post::type

我試過聚合,但它沒有給出預期的 output。我正在嘗試獲取 output,如下所示

[
  {
    "type": "event",
    "_id": "63241dffb0f6770c23663230",
    "user_id": "63241dffb0f6770c23663230",
    "post_id": {
      "date": "2022-09-16T07:07:18.242+00:00",
      "_id": "63241dffb0f6770c23663230",
      "user_id": "63241dffb0f6770c23663230",
      "venue": "Some Place",
      "lat": "null",
      "long": "null"
    },
    "likes": 50
  },
  {
    "type": "poll",
    "_id": "63241dffb0f6770c23663230",
    "user_id": "63241dffb0f6770c23663230",
    "post_id": {
      "created_date": "2022-09-16T07:07:18.242+00:00",
      "_id": "63241dffb0f6770c23663230",
      "user_id": "63241dffb0f6770c23663230",
      "question": "Question??????",
      "poll_opt1": "Yes",
      "poll_opt2": "No",
      "poll_opt1_count": "5",
      "poll_opt2_count": "2"
    },
    "likes": 50
  }
]

有沒有有效的方法來實現這個或更好的 MongoDb 模式來管理這些類型的記錄?

你可以嘗試這樣的事情,使用$facet

db.posts.aggregate([
  {
    "$facet": {
      "eventPosts": [
        {
          "$match": {
            type: "event"
          },
          
        },
        {
          "$lookup": {
            "from": "events",
            "localField": "post_id",
            "foreignField": "_id",
            "as": "post_id"
          }
        }
      ],
      "pollPosts": [
        {
          "$match": {
            type: "poll"
          },
          
        },
        {
          "$lookup": {
            "from": "poll",
            "localField": "post_id",
            "foreignField": "_id",
            "as": "post_id"
          }
        }
      ]
    }
  },
  {
    "$addFields": {
      "doc": {
        "$concatArrays": [
          "$pollPosts",
          "$eventPosts"
        ]
      }
    }
  },
  {
    "$unwind": "$doc"
  },
  {
    "$replaceRoot": {
      "newRoot": "$doc"
    }
  },
  {
    "$addFields": {
      "post_id": {
        "$cond": {
          "if": {
            "$eq": [
              {
                "$size": "$post_id"
              },
              0
            ]
          },
          "then": {},
          "else": {
            "$arrayElemAt": [
              "$post_id",
              0
            ]
          }
        }
      }
    }
  }
])

我們在查詢中執行以下操作:

  1. $facet中的不同post_type執行兩次$lookups 不幸的是,這會隨着post_type的不同值而增加。

  2. 然后我們使用$concatArray組合從$facet獲得的所有 arrays。

  3. 然后我們展開串聯數組,並使用$replaceRoot將嵌套文檔帶到根目錄。

  4. 最后,對於post_id ,我們選擇第一個數組元素(如果存在)以匹配所需的 output。

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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