【问题标题】:MongoDB - Get an unique array from two queriesMongoDB - 从两个查询中获取一个唯一的数组
【发布时间】:2022-01-11 11:10:46
【问题描述】:

如果标题不能反映我真正需要做的事情,首先抱歉。

想象一个代表什么产品卖给哪个供应商的集合。让我们简化如下:

{_id, productID, VendorID, Price, Stock}

例如,我们可以:

{_id: 1 ,productID: 1, vendorID: A, price: 0, stock: 0},
{_id: 2 ,productID: 2, vendorID: A, price: 0, stock: 0},
{_id: 3 ,productID: 3, vendorID: A, price: 0, stock: 0},
{_id: 4 ,productID: 4, vendorID: A, price: 0, stock: 0},
{_id: 5 ,productID: 1, vendorID: B, price: 0, stock: 19},
{_id: 6 ,productID: 3, vendorID: B, price: 0, stock: 21}

我们的想法是,供应商 A 是超级管理员,负责控制哪些产品可以在市场上销售。这就是 A 销售的所有产品的价格 = 0 且库存 = 0 的原因。

我试图在同一个查询中得到的是。当供应商 B 被记录时:

  • 列出 A 销售的所有商品。
  • 但是如果一个产品是 B 卖的,那我应该退回它而不是 A-one。

结果如下:

    {_id: 2 ,productID: 2, vendorID: A, price: 0, stock: 0},
    {_id: 4 ,productID: 4, vendorID: A, price: 0, stock: 0},
    {_id: 5 ,productID: 1, vendorID: B, price: 0, stock: 19},
    {_id: 6 ,productID: 3, vendorID: B, price: 0, stock: 21}

你知道我怎么能一次完成吗?

我可以在前端进行过滤,但我更喜欢这样做,以避免例如分页问题。

【问题讨论】:

  • 那么,对于 ID 为 1、2、3、4 的产品,您想要的响应是 ID 为 5、2、6、4 的记录数组,对吧?
  • 是的@Xeelley。我更新了帖子..谢谢

标签: database mongodb


【解决方案1】:

如果您确定 A总是 销售的所有产品的价格 = 0 且库存 = 0,则可以执行以下技巧:

db.collection.aggregate({
  $match: {
    vendorID: {
      $in: [
        "A",
        "B"
      ]
    }
  }
},
{
  $sort: {
    productID: 1,
    price: -1
  }
},
{
  "$group": {
    "_id": "$productID",
    "product": {
      $first: "$$ROOT"
    }
  }
})

Mongo playground

  • $match 您正在查找默认供应商 (A) 和目标供应商 (B) 拥有的所有产品。
  • $sort 将产品按productID 和每组的价格分组,因此A 销售的产品将在每组中最后一个
  • $group 您从每个组中提取产品
  • 使用$first将是第一个产品(价格较高,因此A销售的产品只有在没有其他具有相同ID的产品销售时才会匹配)。

DB 文档将由$$ROOT 聚合到product 字段中,因此您可以使用以下方式映射它们:

// (javascript)
const productDocuments = aggregationResult.map(row => row.product);

注意:A销售的产品即使B销售的产品具有相同的ID,在B的产品价格也为0的情况下仍然可以提取。

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多