簡體   English   中英

MongoDB - 從兩個查詢中獲取唯一數組

[英]MongoDB - Get an unique array from two queries

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

想象一個代表什么產品賣給哪個供應商的集合。 讓我們簡化如下:

{_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}

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

我可以在前端進行過濾,但我更喜歡這樣做,以避免例如分頁問題。

如果您確定A銷售的所有產品的價格 = 0 且庫存 = 0,則可以執行以下技巧:

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

蒙古游樂場

  • 通過$match您正在尋找默認供應商 ( A ) 和目標供應商 ( B ) 擁有的所有產品。
  • by $sort您按productID和按價格在每組中對產品進行分組,因此A銷售的產品將是每組中的最后一個
  • 通過$group你從每個組中提取產品
  • 使用$first它將是第一個產品(價格更高,因此只有在沒有銷售具有相同 ID 的其他產品時,才會匹配A銷售的產品)。

數據庫文檔將通過$$ROOT聚合到product字段中,因此您可以使用 map 它們:

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

注意:如果B的產品也有 price = 0 的情況下,即使B銷售的產品具有相同的 ID,仍然可以提取A銷售的產品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM