我目前有 2 個集合:
users 看起來像:
const User = new Schema({
username:{
type: String,
required: true
},
password:{
type: String,
required: true
},
refreshTokens:{
type: String,
required: false,
},
// ID of the guild a user belongs to
guildID:{
type: Schema.Types.ObjectId,
ref: 'guilds',
default: '61a679e18d84bff40c2f88fd',
required: true
},
power:{
type: Number,
required: true,
default: 100
}
})
guilds 包含 objectID 作為 _id 和欄位“name”。
現在我想通過用戶名獲取檔案以及用戶所屬公會的資訊。
我閱讀了有關使用db.collection.aggregate它的資訊,但是會導致所有用戶及其公會資訊。是否可以$match在聚合內部使用來獲取單個用戶名?我對 MongoDB 還很陌生,我只是在嘗試。如果您有任何資源或檔案,我也很樂意閱讀它們!
在 SQL 中,它看起來像:
SELECT * FROM users where username = 'SomeUsername' INNER JOIN guilds on users.guildID = guilds.id
uj5u.com熱心網友回復:
聚合可以解決這個問題(不推薦)
userCollection.aggregate([
{
$lookup: {
from: 'guilds',
as: 'guild',
localeField: 'guildID',
foreignField: '_id',
}
},
{
$unwrap: {
path: '$guilds',
preserveNullAndEmptyArrays: true
},
{
$match: {
$or: [
{ 'guild._id': guildId },
{ ... other options ... }
]
}
}
])
雖然這有效并且可以根據您的索引和檔案數量相當快,但最好將經常查詢的欄位添加到相關檔案中。在您的情況下:將 guildId 和 guildName 添加到您的用戶。
雖然這會復制資料并且在關系資料庫中可能不被視為最佳實踐,但在基于檔案的資料庫中這樣做很常見。這是最快的解決方案。
聚合和嵌入 guildData 到用戶的替代方法是發送兩個查詢。一份給用戶,一份給公會。這稱為關系模式。這是我認為最常見的解決方案)
許多(全部?)ODM 庫,例如 mongoose,會自動為您處理關系決議(mongoose 稱此為種群)。我認為這可以大大簡化查詢!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/374666.html
標籤:MongoDB
上一篇:CodeIgniterMySQLLIKE查詢不起作用
下一篇:如何有條件地計算金額?
