我在 MongoDB 中有一個集合,其簡化版本如下所示:
Dealers = [{
Id: 123,
Name: 'Someone',
Email: '[email protected]',
Vehicles: [
{
Id: 1234,
Make: 'Honda',
Model: 'Civic'
},
{
Id: 2345,
Make: 'Ford',
Model: 'Focus'
},
{
Id: 3456,
Make: 'Ford',
Model: 'KA'
}
]
}]
我的貓鼬模型看起來有點像這樣:
const vehicle_model = mongoose.Schema({
Id: {
Type: Number
},
Email: {
Type: String
},
Vehicles: [{
Id: {
Type: Number
},
Make: {
Type: String
},
Model: {
Type: String
}
}]
})
注意 Id 不是 MongoDB Id,只是不同的數字。
我嘗試做這樣的事情:
const response = await vehicle_model.findOne({ 'Id': 123, 'Vehicles.Id': 1234 })
但是當我這樣做時:
console.log(response.Vehicles.length)
它回傳了所有 Vehicles 嵌套記錄,而不是我所追求的記錄。
我究竟做錯了什么?
謝謝。
uj5u.com熱心網友回復:
這個問題被問得非常頻繁。確實有人在此問題前 18 分鐘在這里提出了一個相關問題。
查詢資料庫時,您要求它識別并將匹配的檔案回傳給客戶端。這完全是一個單獨的操作,而不是要求它在將這些檔案發送回客戶端之前轉換它們的形狀。
在 MongoDB 中,后一種操作(轉換檔案的形狀)通常稱為“投影”。簡單的投影,特別是只回傳欄位的子集,可以直接在find()(和類似的)操作中完成。大多數驅動程式和 shell 使用方法的第二個引數作為投影規范,請參閱檔案中的此處。
您的特殊情況有點復雜,因為您正在尋找洗掉陣列中的一些值。檔案中有一個名為“從查詢回傳的專案欄位”的專用頁面,其中詳細介紹了不同的情況。實際上,靠近底部的是一個名為“回傳陣列中的專案特定陣列元素”的部分,它更直接地描述了您的情況。他們在其中描述了位置$運算子的用法。您可以將其用作起點,如下所示:
db.collection.find({
"Id": 123,
"Vehicles.Id": 1234
},
{
"Vehicles.$": 1
})
操場示范在這里。
如果您需要更復雜的東西,那么您將不得不開始探索(投影)運算子(而不是查詢變體)的用法$elemMatch,或者正如@nimrod serok 在評論中提到的那樣,在聚合管道中使用聚合運算子。這里的最后一個選項當然是最具表現力和靈活性的,但也是最冗長的。 $filter
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517997.html
標籤:mongodb猫鼬
