我正在使用 Node.js 中的 mongoose 開發 mongo 資料庫。
我有一個這樣的集合:
{
cinema: 'xxx',
account: 'yyy',
media: {
data: [{
id: 1,
name: 'zzz'
}, {
id: 2,
name: 'zzz'
},
...
]
}
}
架構:
const dataCacheSchema = new mongoose.Schema(
{
cinemaName: String,
account: String
},
{ timestamps: true, strict: false }
);
資料串列可能很長。我想從 findOne 查詢中檢索單個媒體:
{
id: 1,
name: 'zzz'
}
我試過這樣:
const doc: mongoose.Document[] | null = await DataCache.findOne(
{
cinemaName: ci.cinema,
account: ci.account,
'media.data': { $exists: true, $elemMatch: { id: mediaId } }
},
{ media: { data: { $elemMatch: { id: mediaId } } } }
).exec();
但它會因錯誤訊息而崩潰:
MongoError: Cannot use $elemMatch projection on a nested field.
uj5u.com熱心網友回復:
您可以使用聚合框架來做到這一點:
$match- 根據檔案欄位過濾檔案$projectwith$filter- 過濾并僅回傳媒體欄位$first- 只回傳上面生成的陣列中的第一項$replaceRoot- 直接回傳媒體欄位的值,而不是作為嵌套屬性
db.collection.aggregate([
{
"$match": {
"cinemaName": "name 1",
"account": "account 1",
"media.data.id": "1"
}
},
{
"$project": {
"media": {
"$first": {
"$filter": {
"input": "$media.data",
"cond": {
"$eq": [
"$$this.id",
"1"
]
}
}
}
}
}
},
{
"$replaceRoot": {
"newRoot": "$media"
}
}
])
作業示例
uj5u.com熱心網友回復:
您可以使用aggregate查詢來獲得預期的結果:
db.aggregate(
{
$match: {
cinema: "xx3",
account: "yy3",
},
},
{ $unwind: "$media.data" },
{ $match: { "media.data.id": 1 } },
{ $project: {
cinema: 1,
account: 1,
"media.data": [{id: "$media.data.id", name: "$media.data.name"}]
} }
);
// Output: { "_id" : ObjectId("..."), "media" : { "data" : [ { "id" : 1, "name" : "zzz" } ] } }
db.aggregate(
{
$match: {
cinema: "xx3",
account: "yy3",
},
},
{ $unwind: "$media.data" },
{ $match: { "media.data.id": 1 } },
{ $project: {
"result": "$media.data"
} }
);
// Output: { "_id" : ObjectId("..."), "result" : { "id" : 1, "name" : "zzz" } }
db.aggregate(
{
$match: {
cinema: "xx3",
account: "yy3",
},
},
{ $unwind: "$media.data" },
{ $match: { "media.data.id": 1 } },
{ $replaceRoot: {
newRoot: "$media.data"
}}
);
// Output: { "id" : 1, "name" : "zzz" }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/427364.html
標籤:javascript 节点.js mongodb 表示 猫鼬
下一篇:Mongoose,聚合與Js函式
