MongoDB查询:仅在满足特定条件的情况下才获得文档的加入

发布于 2025-01-18 19:38:11 字数 1400 浏览 1 评论 0原文

我希望 mongodb 查询给出下面的这些详细信息,并获得最佳性能。

让我从一个例子开始:

让我有一个集合,

/// the collection

services = 
[
  {
    _id: obj(id1),
    provider_id: "provider1",
    service_code: "code1",
    price: 20
  },
  {
    _id: obj(id2),
    provider_id: "provider1",
    service_code: "code2",
    price: 20
  },
  {
    _id: obj(id3),
    provider_id: "provider1",
    service_code: "code3",
    price: 20
  },
  {
    _id: obj(id4),
    provider_id: "provider2",
    service_code: "code1",
    price: 10
  },
  {
    _id: obj(id5),
    provider_id: "provider2",
    service_code: "code2",
    price: 20
  },
  {
    _id: obj(id6),
    provider_id: "provider3",
    service_code: "code1",
    price: 20
  }
]

我想要获取(仅)支持这两个服务代码的所有服务提供商:code1、code2。

以及总价按总价排序。

输出是这样的:


/// required output based the posted collection and required requirements.

output = 
          
    [ 
      { 
        provider_id: "provider1",
        total_price: 40,
      },

      { 
        provider_id: "provider2",
        total_price: 30,
      }
]

我不想要这个输出:

[
  {
    "_id": "provider1",
    "total_price": 40
  },
  {
    "_id": "provider2",
    "total_price": 30
  },
  {
    "_id": "provider3",
    "total_price": 20
  }
]

如何完成这个?谢谢

I want to have the mongodb query given these details below, and to have best in performance.

Let me start by an example:

Let me have a collection,

/// the collection

services = 
[
  {
    _id: obj(id1),
    provider_id: "provider1",
    service_code: "code1",
    price: 20
  },
  {
    _id: obj(id2),
    provider_id: "provider1",
    service_code: "code2",
    price: 20
  },
  {
    _id: obj(id3),
    provider_id: "provider1",
    service_code: "code3",
    price: 20
  },
  {
    _id: obj(id4),
    provider_id: "provider2",
    service_code: "code1",
    price: 10
  },
  {
    _id: obj(id5),
    provider_id: "provider2",
    service_code: "code2",
    price: 20
  },
  {
    _id: obj(id6),
    provider_id: "provider3",
    service_code: "code1",
    price: 20
  }
]

I want to get all service providers that (only) support these both service codes : code1, code2.

And the total price sorted by total price.

The output is like this:


/// required output based the posted collection and required requirements.

output = 
          
    [ 
      { 
        provider_id: "provider1",
        total_price: 40,
      },

      { 
        provider_id: "provider2",
        total_price: 30,
      }
]

I don't want this output:

[
  {
    "_id": "provider1",
    "total_price": 40
  },
  {
    "_id": "provider2",
    "total_price": 30
  },
  {
    "_id": "provider3",
    "total_price": 20
  }
]

How to accomplish this? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

昵称有卵用 2025-01-25 19:38:11

这可能是 $group 最基本的用例。

db.collection.aggregate([
  {
    $match: {
      service_code: {
        $in: [
          "code1",
          "code2"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$provider_id",
      "service_codes": {
        "$addToSet": "$service_code"
      },
      "total_price": {
        "$sum": "$price"
      }
    }
  },
  {
    $match: {
      $expr: {
        $eq: [
          {
            "$setIntersection": [
              "$service_codes",
              [
                "code1",
                "code2"
              ]
            ]
          },
          [
            "code1",
            "code2"
          ]
        ]
      }
    }
  },
  {
    $project: {
      service_codes: false
    }
  },
  {
    $sort: {
      total_price: -1
    }
  }
])

这是 Mongo Playground 供您参考。

This is probably the most basic use case of $group.

db.collection.aggregate([
  {
    $match: {
      service_code: {
        $in: [
          "code1",
          "code2"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$provider_id",
      "service_codes": {
        "$addToSet": "$service_code"
      },
      "total_price": {
        "$sum": "$price"
      }
    }
  },
  {
    $match: {
      $expr: {
        $eq: [
          {
            "$setIntersection": [
              "$service_codes",
              [
                "code1",
                "code2"
              ]
            ]
          },
          [
            "code1",
            "code2"
          ]
        ]
      }
    }
  },
  {
    $project: {
      service_codes: false
    }
  },
  {
    $sort: {
      total_price: -1
    }
  }
])

Here is the Mongo playground for your reference.

够钟 2025-01-25 19:38:11

我能够使用$项目获得您需要的输出:

db.collection.aggregate([
  {
    $match: {
      service_code: {
        $in: [
          "code1",
          "code2"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$provider_id",
      "total_price": {
        "$sum": "$price"
      }
    }
  },
  {
    "$project": {
      "provider_id": "$_id",
      "total_price": 1,
      "_id": 0
    },
  },
  {
    $sort: {
      total_price: -1
    }
  }
])

我修改了射线,回答一点,刚刚添加了汇总项目:)我的游乐场在这里

I was able to get the output you needed using $project:

db.collection.aggregate([
  {
    $match: {
      service_code: {
        $in: [
          "code1",
          "code2"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$provider_id",
      "total_price": {
        "$sum": "$price"
      }
    }
  },
  {
    "$project": {
      "provider_id": "$_id",
      "total_price": 1,
      "_id": 0
    },
  },
  {
    $sort: {
      total_price: -1
    }
  }
])

I modified rays answer a little bit and just added the project aggregate :) My playground is here Mongo Playground

昨迟人 2025-01-25 19:38:11

Mongo Playground

这与您想要的输出不同,但它只返回与provider_Id匹配的数据。

    db.collection.aggregate({
  "$unwind": "$service"
},
{
  "$match": {
    "service.provider_id": "provider1"
  }
})

$unwind 文档 $match 文档

Mongo Playground

This is not like your desired output but it only returns the data which matches with provider_Id.

    db.collection.aggregate({
  "$unwind": "$service"
},
{
  "$match": {
    "service.provider_id": "provider1"
  }
})

$unwind documentation $match documentation

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文