获取MongoDB中所有帖子时如何获取相关用户信息

问题描述 投票:0回答:1

您好,我是 MongoDB 新手。我想获取所有包含帖子创建者的用户详细信息的帖子。我有两个收藏。

用户收藏:

[{
   "_id": {
     "$oid": "655d897b794e33f8ae0e2377"
   },
   "name": "kunal",
 },
 {
   "_id": {
     "$oid": "655d897b794e33f8ae0e237b"
   },
   "name": "Amit",
 }]

user_posts集合

[{
    "_id": {
      "$oid": "655d897b794e33f8ae0e2378"
    },
    "user_id": "655d897b794e33f8ae0e2377",
    "post_name": "Test Post Group",
  },
  {
    "_id": {
      "$oid": "655d897b794e33f8ae0e2379"
    },
    "user_id": "655d897b794e33f8ae0e2377",
    "post_name": "Test Post Group",
  },
  {
    "_id": {
      "$oid": "655d897b794e33f8ae0e237a"
    },
    "user_id": "655d897b794e33f8ae0e2377",
    "post_name": "Test Post 3",

  },
  {
    "_id": {
      "$oid": "655d897b794e33f8ae0e237c"
    },
    "user_id": "655d897b794e33f8ae0e237b",
    "post_name": "Test Post Amit",
  }]

在 users 集合中,

_id
ObjectId
,但在 user_posts 集合中,
user_id
不是
ObjectId
。但我不想把
user_id
变成
ObjectId

我尝试了以下查询:

db.user_posts.aggregate([
  {
    '$lookup' : {
      'as' : 'user_info',
      'from' : 'users',
      'foreignField' : '_id',
      'localField' : 'user_id'
    }
  }
]).pretty();

输出:

[
  {
    "_id": ObjectId("655c3285822c4a52150c30a8"),
    "post_name": "Test Post",
    "user_id": "655c3285822c4a52150c30a7",
    "user_info": []
  },
  {
    "_id": ObjectId("655c3285822c4a52150c30a9"),
    "post_name": "Test Post 2",
    "user_id": "655c3285822c4a52150c30a7",
    "user_info": []
  },
  {
    "_id": ObjectId("655c3285822c4a52150c30aa"),
    "post_name": "Test Post 3",
    "user_id": "655c3285822c4a52150c30a7",
    "user_info": []
  }
]

仅当在架构级别将

user_id
设为
ObjectId
时,上述查询才有效。可能需要在运行时查询本身将
user_id
转换为
ObjectId
。谁能帮我解决这个问题吗?

https://mongoplayground.net/p/qPQGN2VCH8-

mongodb mongodb-query aggregation-framework
1个回答
1
投票

您必须确保值必须是同一类型才能进行匹配/比较。参考:连接集合上的连接条件和子查询

db.user_posts.aggregate([
  {
    "$lookup": {
      "from": "users",
      "let": {
        user_id: {
          $toObjectId: "$user_id"
        }
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id",
                "$$user_id"
              ]
            }
          }
        }
      ],
      "as": "user_info"
    }
  }
])

演示@Mongo Playgrund

© www.soinside.com 2019 - 2024. All rights reserved.