首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDB中获取前一个和下一个内部子数组

在MongoDB中获取前一个和下一个内部子数组
EN

Stack Overflow用户
提问于 2022-04-29 04:43:50
回答 2查看 46关注 0票数 0

我有一个如下的数据库。

代码语言:javascript
复制
[
    {
        "title": "Data 1",
        "slug": "data-1",
        "sub_docs": [
            {
                "name": "Sub Doc 1",
                "sub_slug": "sub-doc-1",
                "urls": [
                    "https://example.com/path-1",
                ]
            },
            {
                "name": "Sub Doc 2",
                "sub_slug": "sub-doc-2",
                "urls": [
                    "https://example.com/path-2"
                ]
            },
            {
                "name": "Sub Doc 3",
                "sub_slug": "sub-doc-3",
                "urls": [
                    "https://example.com/path-3",
                ]
            }
        ]
    }
]

当我给出数据-1和子文档-2作为输入时,我想得到以下结果。

代码语言:javascript
复制
{
    "title": "Data 1",
    "sub_doc_title": "Sub Doc 2",
    "urls": [
        "https://example.com/path-2"
    ],
    "prev": {
        "name": "Sub Doc 1",
        "sub_slug": "sub-doc-1"
    },
    "next": {
        "name": "Sub Doc 3",
        "sub_slug": "sub-doc-3"
    }
}

我是MongoDB的初学者。如何进行此查询?你有什么主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-30 14:36:11

谢谢rickhg12hs的回答。我也找到了解决这个问题的办法。

这是我的答案;

代码语言:javascript
复制
db.collection.aggregate([
  {
    "$match": {
      "slug": "data-1"
    }
  },
  {
    "$addFields": {
      "sub_doc_index": {
        "$indexOfArray": [
          "$sub_docs.sub_slug",
          "sub-doc-2"
        ]
      }
    }
  },
  {
    "$project": {
      "title": 1,
      "sub_doc_title": {
        "$arrayElemAt": [
          "$sub_docs.name",
          "$sub_doc_index"
        ]
      },
      "urls": {
        "$arrayElemAt": [
          "$sub_docs.urls",
          "$sub_doc_index"
        ]
      },
      "prev": {
        "$cond": {
          "if": {
            "$eq": [
              {
                "$subtract": [
                  "$sub_doc_index",
                  1
                ]
              },
              -1
            ]
          },
          "then": {},
          "else": {
            "name": {
              "$arrayElemAt": [
                "$sub_docs.name",
                {
                  "$subtract": [
                    "$sub_doc_index",
                    1
                  ]
                }
              ]
            },
            "slug": {
              "$arrayElemAt": [
                "$sub_docs.sub_slug",
                {
                  "$subtract": [
                    "$sub_doc_index",
                    1
                  ]
                }
              ]
            }
          },
          
        },
        
      },
      "next": {
        "name": {
          "$arrayElemAt": [
            "$sub_docs.name",
            {
              "$add": [
                "$sub_doc_index",
                1
              ]
            }
          ]
        },
        "slug": {
          "$arrayElemAt": [
            "$sub_docs.sub_slug",
            {
              "$add": [
                "$sub_doc_index",
                1
              ]
            }
          ]
        }
      }
    }
  },
  
])
票数 1
EN

Stack Overflow用户

发布于 2022-04-30 02:01:14

对于初学者来说,这是一个很难的查询,虽然我仍然认为自己是新手,所以也许有一个更好/更简单的方法。

有一种方法你可以做到。

代码语言:javascript
复制
db.collection.aggregate([
  {
    "$match": {
      "slug": "data-1"  // given argument
    }
  },
  {
    "$set": {
      "reduceOut": {
        "$reduce": {
          "input": "$sub_docs",
          "initialValue": {
            "sub_doc_title": null,
            "urls": [],
            "prev": null,
            "next": null
          },
          "in": {
            "$cond": [
              {
                "$eq": [
                  "$$this.sub_slug",
                  "sub-doc-2"         // given argument
                ]
              },
              {
                "$mergeObjects": [
                  "$$value",
                  {
                    "sub_doc_title": "$$this.name",
                    "urls": "$$this.urls"
                  }
                ]
              },
              {
                "$cond": [
                  { "$eq": [ "$$value.sub_doc_title", null ] },
                  {
                    "$mergeObjects": [
                      "$$value",
                      {
                        "prev": {
                          "name": "$$this.name",
                          "sub_slug": "$$this.sub_slug"
                        }
                      }
                    ]
                  },
                  {
                    "$cond": [
                      { "$eq": [ "$$value.next", null ] },
                      {
                        "$mergeObjects": [
                          "$$value",
                          {
                            "next": {
                              "name": "$$this.name",
                              "sub_slug": "$$this.sub_slug"
                            }
                          }
                        ]
                      },
                      "$$value"
                    ]
                  }
                ]
              }
            ]
          }
        }
      }
    }
  },
  {
    "$replaceWith": {
      "$mergeObjects": [
        {
          "title": "$title"
        },
        "$reduceOut"
      ]
    }
  }
])

mongoplayground.net上试一试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72052927

复制
相关文章

相似问题

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