首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合集合( mongdb )

聚合集合( mongdb )
EN

Stack Overflow用户
提问于 2018-09-20 09:12:12
回答 1查看 79关注 0票数 1

如何在followedId单数据库数组中填充聚合查询结果

代码语言:javascript
复制
var followeduserId = ["abc","efg","xyz","pqr","acd","rts"];

提要推荐

代码语言:javascript
复制
[
  {
    "feedsId": "feed1",
    "userId": "abc"
  },
  {
    "feedsId": "feed1",
    "userId": "efg"
  }
]

提要集合

代码语言:javascript
复制
[
  {
    "link": "www.yodo.com",
    "recommended": [
      "abc",
      "efg"
    ],
    "title": "This is my feed7",
    "topics": [
      "topi1",
      "topi2",
      "topi3",
      "topi4"
    ]
  },
  {
    "link": "www.yodo.com",
    "recommended": [
      "abc",
      "efg",
      "das",
      "asd",
      "eqw",
      "weq"
    ],
    "title": "This is my feed8",
    "topics": [
      "topi1",
      "topi2",
      "topi3",
      "topi4"
    ]
  }
]

运行聚合查询

代码语言:javascript
复制
feedsrecommended.aggregate([
  { $match: { userId: { $in: "followersId" }}},
  { $lookup: {
    from: "feeds",
    localField: "feedsId",
    foreignField: "_id",
    as: "feedsId"
  }},
  { $group: {
    "_id": { "feedsId": "$feedsId" },
    "count": { "$sum": 1 }
  }},
  { $sort: { count: -1 }}
])

聚合后结果

代码语言:javascript
复制
var resultfeeds = [
  {
    "count": 7,
    "id": {
      "_id": "feed1",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "efg",
        "xyz",
        "pqr",
        "acd",
        "rts"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi1",
        "topi8",
        "topi6",
        "topi5"
      ]
    }
  },
  {
    "count": 3,
    "id": {
      "_id": "feed5",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "efg",
        "acd",
        "rts"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi1",
        "topi2",
        "topi3",
        "topi4"
      ]
    }
  },
  {
    "count": 3,
    "id": {
      "_id": "feed6",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "efg",
        "xyz",
        "pqr"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi7",
        "topi1",
        "topi4",
        "topi8"
      ]
    }
  },
  {
    "count": 2,
    "id": {
      "_id": "feed2",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "acd",
        "rts"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi7",
        "topi6",
        "topi8"
      ]
    }
  },
  {
    "count": 2,
    "id": {
      "_id": "feed7",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "efg"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi1",
        "topi5",
        "topi6",
        "topi4"
      ]
    }
  },
  {
    "count": 1,
    "id": {
      "_id": "feed3",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "asd",
        "eqw",
        "weq"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi1",
        "topi7",
        "topi6",
        "topi4"
      ]
    }
  },
  {
    "count": 1,
    "id": {
      "_id": "feed8",
      "link": "www.yodo.com",
      "recommended": [
        "abc",
        "das",
        "asd",
        "eqw",
        "weq"
      ],
      "title": "This is my feed1",
      "topics": [
        "topi1",
        "topi2",
        "topi5",
        "topi4"
      ]
    }
  }
]

我想填充主题并在结果中重新组合userName和图像

主题集合

代码语言:javascript
复制
[
  {
    "topic_name": "tiger"
  },
  {
    "topic_name": "loin"
  }
]

用户集合

代码语言:javascript
复制
[
  {
    "name": "deepa",
    "profileImg": "www.com/facebook.jpg"
  },
  {
    "name": "nisa",
    "profileImg": "www.com/facebook.jpg"
  }
]

我的最后一个结果应该是这样

代码语言:javascript
复制
[
  {
    "count": 2,
    "id": {
      "_id": "feed2",
      "link": "www.yodo.com",
      "recommended": [
        {
          "_id": "abc",
          "name": "deepa",
          "profileImg": "www.com/facebook.jpg"
        },
        {
          "_id": "acd",
          "name": "sigger",
          "profileImg": "www.com/facebook.jpg"
        },
        {
          "_id": "rts",
          "name": "buster",
          "profileImg": "www.com/facebook.jpg"
        }
      ],
      "title": "This is my feed1",
      "topics": [
        {
          "_id": "topi6",
          "topic_name": "boolena"
        },
        {
          "_id": "topi7",
          "topic_name": "mika"
        },
        {
          "_id": "topi8",
          "topic_name": "tika"
        }
      ]
    }
  }
]
EN

回答 1

Stack Overflow用户

发布于 2018-09-20 11:55:38

您可以尝试在mongodb 3.6及更高版本中进行以下聚合

代码语言:javascript
复制
Feedsrecommended.aggregate([
  { "$match": { "userId":{ "$in": followersId }}},
  { "$group": {
    "_id": "$feedsId",
    "count": { "$sum": 1 }
  }},
  { "$lookup": {
    "from": "feeds",
    "let": { "feedsId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$feedsId" ] }}},
      { "$lookup": {
        "from": "topics",
        "let": { "topics": "$topics" },
        "pipeline": [
          { "$match": { "$expr": { "$in": [ "$_id", "$$topics" ] } } }
        ],
        "as": "topics"
      }},
      { "$lookup": {
        "from": "users",
        "let": { "recommended": "$recommended" },
        "pipeline": [
          { "$match": { "$expr": { "$in": [ "$_id", "$$recommended" ] } } }
        ],
        "as": "recommended"
      }}
    ],
    "as": "feedsId"
  }}
])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52421515

复制
相关文章

相似问题

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