簡體   English   中英

MongoDB 僅從數組內的對象中獲取選定的元素

[英]MongoDB get only selected elements from objects inside an array

我所擁有的是 MongoDB 中具有類似結構的文檔集合

[
  {
    "userid": "user1",
    "addresses": [
      {
        "type": "abc",
        "street": "xyz"
      },
      {
        "type": "def",
        "street": "www"
      },
      {
        "type": "hhh",
        "street": "mmm"
      },
      
    ]
  },
  {
    "userid": "user2",
    "addresses": [
      {
        "type": "abc",
        "street": "ccc"
      },
      {
        "type": "def",
        "street": "zzz"
      },
      {
        "type": "hhh",
        "street": "yyy"
      },
      
    ]
  }
]

如果我可以給出“type”和“userid”,我怎樣才能得到結果

[
  {
    "userid": "user2",
    "type": "abc",
    "street": "ccc",   
  }
]

即使我只能得到“街道”作為結果,那也很棒。 唯一的限制是我需要在根元素本身而不是數組中獲取它

您應該能夠使用unwindmatchproject ,如下所示:

db.collection.aggregate([
{
  "$unwind": "$addresses"
},
{
  "$match": {
    "addresses.type": "abc",
    "userid": "user1"
  }
},
{
  "$project": {
    "_id": 0,
    "street": "$addresses.street"
  }
}
])

您還可以將match步驟復制為第一步,以減少要unwind的文檔數量。

這是操場鏈接

這里有一個類似的問題/答案。

像這樣的東西:

db.collection.aggregate([
{
 $match: {
   userid: "user1" , "address.type":"abc"
}
},
{
$project: {
  userid: 1,
  address: {
    $filter: {
      input: "$addresses",
      as: "a",
      cond: {
        $eq: [
          "$$a.type",
          "abc"
        ]
      }
    }
  }
}
},
{
  $unwind: "$address"
},
{
$project: {
  userid: 1,
  street: "$address.street",
  _id: 0
  }
}
])

解釋:

  1. 僅過濾具有您需要的用戶 ID 和地址類型的文檔
  2. 僅投影/過濾具有所需類型的地址元素
  3. 展開地址數組
  4. 僅根據要求項目所需的元素

為了獲得最佳結果,在 { userid:1 } 字段上創建索引或在 { userid:1, address.type:1 } 字段上創建復合索引

操場

暫無
暫無

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

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