我目前正在使用mongoDB。
我有一个名为Users的集合,其中包含以下文档:

{
  _id: "5d93f338e602a10a38ad3588",
  userID: "1",
  email: "[email protected]",
  password: "password",
  firstName: "Tom",
  lastName: "Bombadil"
}


我也有一个名为Posts的集合。附带文件:

{
  _id: "5d93fddce602a10a38ad358a",
  postID: "1",
  userID: "1",
  postContent: "hello world"
}


我可以通过Users的以下$ lookup来“加入”这两个:

{
  from: 'Posts',
  localField: 'userID',
  foreignField: 'useriD',
  as: 'usersPosts'
}


我该如何编写查询以获取所述Post的“ postContent”?类似于以下内容:

db.Users.find($lookup :     {
      from: 'Posts',
      localField: 'userID',
      foreignField: 'useriD',
      as: 'usersPosts'
    } : userPosts[0]

最佳答案

您可以通过执行以下操作获得每个用户的postContent列表;

db.Users.aggregate([
  {
    $lookup: {
      from: "Posts",
      localField: "userID",
      foreignField: "userID",
      as: "usersPosts"
    }
  },
  {
    $addFields: {
      userPostContents: "$usersPosts.postContent"
    }
  },
  {
    $project: {
      userID: 1,
      userPostContents: 1
    }
  }
])


在完成$lookup之后,您已经知道,我们可以使用postContentuserPosts数组中仅使用addFields字段创建一个数组。将对象数组转换为字符串数组。

请参阅mongoplayground上的代码

这将为您提供每个postContentuser列表;

[
  {
    "_id": "5d93f338e602a10a38ad3588",
    "userID": "1",
    "userPostContents": [
      "hello world"
    ]
  }
]




或者,如果您只想获得每个postContent中第一个postuser,则将您的$project阶段更改为;

{
  $project: {
    userID: 1,
    userPostContent: {
      $arrayElemAt: [
        "$userPostContents",
        0
      ]
    }
  }
}


只会得到第一个postContent,例如;

[
  {
    "_id": "5d93f338e602a10a38ad3588",
    "userID": "1",
    "userPostContent": "hello world"
  }
]


还要在mongoplayground上进行检查

关于mongodb - 通过mongoDB从$ lookup引用字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58194215/

10-13 05:09