最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

按标签的猫鼬聚合组项目

IT培训 admin 11浏览 0评论

按标签的猫鼬聚合组项目

我正在尝试按标签对项目进行分组。但是我没有得到我想要做的。

[具有标签的架构项目(_idnametags)是tags_id的数组(从标签架构中引用)

Item = new Schema({
    id: Schema.ObjectId,
    name: String,
    tags: [ { type: Schema.ObjectId, ref: 'Tag' }]
});

Tag = new Schema({
    id: Schema.ObjectId,
    name: String
});

这是我到目前为止所做的:

Item.aggregate([
        {
          "$lookup": {
            "from": Tag.collection.name,
            "let": { "tags": "$tags" },
            "pipeline": [
              {
                "$match": {
                  "$expr": { "$in": ['$_id', '$$tags'] }
                }
              },
              {
                "$project": {
                  "_id": 1,
                  "name": 1
                }
              }
            ],
            "as": 'tags'
          }
        },
        {
          "$group": {
            "_id": "$tags._id",
            "items": {
              "$push": {
                "id": "$_id",
                "name": "$name",
              }
            }
          }
        }
      ]);

这就是我得到的

{
  "data": [
    {
      "_id": [
        "5eb95e8dcae79713f1de0a27"
      ],
      "items": [
        {
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        }
      ]
    },
    {
      "_id": [
        "5eb9564dc4317411fe79e1bf"
      ],
      "items": [
        {
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        },
        {
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        }
      ]
    }
  ]
}

我想获得每个标签的name,而不仅仅是_id可能不在数组中。在我希望收到的结果下方:

{
  "data": [
    {
      "_id": "5eb95e8dcae79713f1de0a27",
      "name": "My Tag name 1",
      "items": [
        {
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        }
      ]
    },
    {
      "_id": "5eb9564dc4317411fe79e1bf",
      "name": "My Tag name 2",
      "items": [
        {
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        },
        {
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        }
      ]
    }
  ]
}

我在做什么错?

回答如下:

一种解决方法是将name添加到您的$group运算符:

...
{
    "$group": {
        "_id": "$tags._id",
        "name": {
            "$first": "$name"
        },
        "items": {
            "$push": {
                "id": "$_id",
                "name": "$name",
            }
        }
    }
}
...

注意,这将获取每个组的第一个匹配条目。另一种选择是使用$replaceRoot$mergeObjects运算符,就像完成here一样。

按标签的猫鼬聚合组项目

我正在尝试按标签对项目进行分组。但是我没有得到我想要做的。

[具有标签的架构项目(_idnametags)是tags_id的数组(从标签架构中引用)

Item = new Schema({
    id: Schema.ObjectId,
    name: String,
    tags: [ { type: Schema.ObjectId, ref: 'Tag' }]
});

Tag = new Schema({
    id: Schema.ObjectId,
    name: String
});

这是我到目前为止所做的:

Item.aggregate([
        {
          "$lookup": {
            "from": Tag.collection.name,
            "let": { "tags": "$tags" },
            "pipeline": [
              {
                "$match": {
                  "$expr": { "$in": ['$_id', '$$tags'] }
                }
              },
              {
                "$project": {
                  "_id": 1,
                  "name": 1
                }
              }
            ],
            "as": 'tags'
          }
        },
        {
          "$group": {
            "_id": "$tags._id",
            "items": {
              "$push": {
                "id": "$_id",
                "name": "$name",
              }
            }
          }
        }
      ]);

这就是我得到的

{
  "data": [
    {
      "_id": [
        "5eb95e8dcae79713f1de0a27"
      ],
      "items": [
        {
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        }
      ]
    },
    {
      "_id": [
        "5eb9564dc4317411fe79e1bf"
      ],
      "items": [
        {
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        },
        {
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        }
      ]
    }
  ]
}

我想获得每个标签的name,而不仅仅是_id可能不在数组中。在我希望收到的结果下方:

{
  "data": [
    {
      "_id": "5eb95e8dcae79713f1de0a27",
      "name": "My Tag name 1",
      "items": [
        {
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        }
      ]
    },
    {
      "_id": "5eb9564dc4317411fe79e1bf",
      "name": "My Tag name 2",
      "items": [
        {
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        },
        {
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        }
      ]
    }
  ]
}

我在做什么错?

回答如下:

一种解决方法是将name添加到您的$group运算符:

...
{
    "$group": {
        "_id": "$tags._id",
        "name": {
            "$first": "$name"
        },
        "items": {
            "$push": {
                "id": "$_id",
                "name": "$name",
            }
        }
    }
}
...

注意,这将获取每个组的第一个匹配条目。另一种选择是使用$replaceRoot$mergeObjects运算符,就像完成here一样。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论