首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MONGODB :将父文档保存在同一个集合中,而不是childs文档

MONGODB :将父文档保存在同一个集合中,而不是childs文档
EN

Stack Overflow用户
提问于 2020-10-31 00:41:09
回答 1查看 281关注 0票数 0

在请求mongoDb时,我有点头疼。我得到了一个包含文档的集合,它可以在同一个集合中包含一个父文档。这是我的收藏品。

父文档

代码语言:javascript
运行
复制
{
    "_id": {"$oid": "5f9cac3598361b3370ea47c6"},
    "title": "My Title",
    "type":1,
    "question": "",
    "answerList": [],
    "__v": 0
}

儿童1

代码语言:javascript
运行
复制
{
    "_id": {"$oid": "5f9cac3598361b3370ea47c7"},
    "title": "My Title",
    "type":1,
    "question": "Q1 ?",
    "answerList": [
    {
         "_id": {"$oid": "5f9cac3598361b3370ea47c9"},
        "answer": "Hello1",
    }, 
    {
        "_id": {"$oid": "5f9cac3598361b3370ea47c8"},
        "answer": "Hello2",
    }],
    "parentId": {"$oid": "5f9cac3598361b3370ea47c6"},
    "__v": 0
}

儿童2

代码语言:javascript
运行
复制
{
    "_id": {"$oid": "5f9cac3598361b3370ea47ca"},
    "title": "My Title",
    "type":1,
    "question": "Q2",
    "answerList": [
     {
        "_id": {"$oid": "5f9cac3598361b3370ea47cc"},
        "answer": "Byebye1"
     }, 
     {
        "_id": {"$oid": "5f9cac3598361b3370ea47cb"},
        "answer": "Byebye2",
    }],
    "feedType": "SURVEY",
    "parentId": {"$oid": "5f9cac3598361b3370ea47c6"},
    "__v": 0
}

编辑

我想提出一个字段的请求问题answerList类型。逻辑上,只返回子文档。问题是:如果某些文档有父文档,我只想要父文档,如果文档没有父文档,我想返回这个文档。我不知道该怎么做请帮帮我

我的基本要求

代码语言:javascript
运行
复制
var polls = MyModel.find({
  $and: [
    { confidentiality: ConfidentialityEnum.PUBLIC },
    {
      $or: [
        { question: { $regex: fields.query, $options: "i" } },
        {
          answerList: {
            $elemMatch: { answer: { $regex: fields.query, $options: "i" } },
          },
        },
      ],
    },
  ],
})
  .populate("createdBy", ["firstName", "lastName", "avatar"])
  .select("+voteList")
  .populate("voteList.user", ["_id", "avatar"])
  .select("+commentList")
  .populate("commentList.user", "_id")
  .then((data) => {
    return data;
  });

新请求(thx @Brmm)

代码语言:javascript
运行
复制
const result = MyModel.aggregate([
  {
    $match: {
      $and: [
        { confidentiality: ConfidentialityEnum.PUBLIC },
        {
          $or: [
            { question: { $regex: fields.query, $options: 'i' } },
            {
              answerList: {
                $elemMatch: { answer: { $regex: fields.query, $options: 'i' } },
              },
            },
          ],
        }
      ]
    },
  },
  {
    $lookup: {
      from: 'questions',
      localField: 'parentId',
      foreignField: '_id',
      as: 'parent',
    },
  },
  {
    $unwind: {
      path: '$parent',
      preserveNullAndEmptyArrays: true,
    },
  },
]).then((data => {
    console.log(data);
}))

问题:

  • In console.log I获取具有父文档而不是父文档的文档。

  • 可以用MyModel.aggregate ?

填充我的结果吗?

(预先多谢!)

亚历克斯

EN

回答 1

Stack Overflow用户

发布于 2020-10-31 01:12:45

您应该将数据分成“问题”和“回答”两个集合,并使用$lookup聚合管道。

尽管如此,如果你真的想要这样的话,你可以试试下面的管道。注意,$unwind确保每个结果只有一个父级。如果您有多个具有相同id的父母,您将得到多个独立的结果。如果您想要一个包含所有父级的数组,那么删除$unwind。

代码语言:javascript
运行
复制
const result = await MyModel.aggregate([
  {
    $match: {
      $or: [
        { question: { $regex: 'Byebye', $options: 'i' } },
        {
          answerList: {
            $elemMatch: { answer: { $regex: 'Byebye', $options: 'i' } },
          },
        },
      ],
    },
  },
  {
    $lookup: {
      from: 'questions',
      localField: 'parentId',
      foreignField: '_id',
      as: 'parent',
    },
  },
  {
    $unwind: {
      path: '$parent',
      preserveNullAndEmptyArrays: true,
    },
  },
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64617365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档