首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在mongodb中使用lookup的外部字段分组

在mongodb中使用lookup的外部字段分组
EN

Stack Overflow用户
提问于 2018-06-04 01:47:28
回答 1查看 701关注 0票数 1

我有两个不同的模型:

  • Promotions
  • Tags

每个促销都有一个引用标签ID的字段。这在我的模式中被引用了,并且运行良好:

代码语言:javascript
复制
const PromotionSchema = mongoose.Schema({
    tags: { type: mongoose.Schema.Types.ObjectId, ref: 'Tag' }
}, { collection: 'promotions' });

我的问题是如何创建一个自定义响应,按标签对所有促销进行分组?如下所示:

代码语言:javascript
复制
{ 
   "tag": {
     "_id": "999",
     "value": "Lorem Ipsum"
   },
   "promotions": [{
      "_id": "0001",
      "value": "Value of promotion Nº1"
   },
   {
      "_id": "0002",
      "value": "Value of promotion Nº2"
   },
    ... And the others that have the same Tag ID assigned
   ]}
}

现在,我正在使用Vanilla Javascript获得所有的促销和过滤。我需要知道如何使用Mongoose来改善这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 02:21:20

你可以尝试下面的聚合函数来实现结果...

如果您有mongodb版本3.6

代码语言:javascript
复制
db.promotion.aggregate([
  // stage 1
  { "$lookup": {
    "from": Promotions.collection.name,
    "let": { "tags": "$tags" },
    "pipeline": [
       { "$match": { "$expr": { "$eq": [ "$_id", "$$tags" ] } } }
     ],
     "as": "tags"
  }},
  // stage 2
  { "$addFields": { 
    "tags": { "$arrayElemAt": [ "$tags", 0 ] }
  }},
  // stage 3
  { "$group": {
    "_id": "$tags._id",
    "promotions": {
        "$push": {
            "fieldName1": "$fieldName1",
            "fieldName2": "$fieldName2",
        }
    }
  }}
 ])

如果您的mongodb版本早于3.6

代码语言:javascript
复制
db.promotion.aggregate([
  { "$lookup": {
    "from": Promotions.collection.name,
    "localField": "tags",
    "foreignField": "_id"
     "as": "tags"
  }},
  { "$unwind": "tags" },
  { "$group": {
    "_id": "$tags._id",
    "promotions": {
        "$push": {
            "fieldName1": "$fieldName1",
            "fieldName2": "$fieldName2",
        }
    }
  }}
 ])

两者都会产生类似的输出

代码语言:javascript
复制
{ 
   "tag": {
     "_id": "999",
     "value": "Lorem Ipsum"
   },
   "promotions": [{
      "_id": "0001",
      "value": "Value of promotion Nº1"
   },
   {
      "_id": "0002",
      "value": "Value of promotion Nº2"
   }
   ]}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50669287

复制
相关文章

相似问题

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