我對 MongoDB/Mongoose 比較陌生,我只執行過簡單的查詢。現在我在嘗試以稍微復雜的方式過濾我的資料庫時遇到了一些麻煩。我已經做了一些研究來解決我以前的問題,但現在我無法繼續前進。這是發生的事情:
這是我的架構:
const userSchema = new mongoose.Schema({
email: String,
password: String,
movies: [
{
title: String,
movieId: Number,
view_count: Number,
rating: Number,
review: String,
},
],
lists: {
watched_movies: [
{
title: String,
director: String,
genres: [{ type: String }],
runtime: Number,
date: Date,
},
],
},
});
我想發出一個GET同時匹配"lists.watched_movies": { _id: req.params.entryId }并匹配"movies.title": req.body.title給定的請求email,以便findOne查詢的結果只是這些元素而不是整個檔案。我想要完成的事情是這樣的:
{
email: "[email protected]",
movies: [
{
title: "Mongoose Strikes Back",
movieId: 123,
view_count: 1,
rating: 3,
review: "Very confusing movie!"
}
],
lists: {
watched_movies: [
{
_id: 4321
title: "Mongoose Strikes Back",
director: "Mongo",
genres: ["Drama"],
runtime: 150,
date: "2021-11-22"
}
]
}
}
然而,我第一次嘗試解決它并沒有成功。這是我嘗試過的:
router.route("/:entryId").get((req, res) => {
User.findOne(
{ email: "[email protected]" },
{
"lists.watched_movies": { $elemMatch: { _id: req.params.entryId } },
movies: { $elemMatch: { title: req.body.title } },
},
(err, entry) => {
if (!err) {
res.send(entry);
console.log(entry);
} else {
console.log(err);
}
}
);
});
它說Cannot use $elemMatch projection on a nested field。我想也許我可以通過改變我的模式來解決它,但如果可能的話,我想避免它。
uj5u.com熱心網友回復:
對于您的場景,您可以使用$filter過濾嵌套陣列欄位中的檔案。
db.collection.find({
email: "[email protected]"
},
{
"lists.watched_movies": {
"$filter": {
"input": "$lists.watched_movies",
"cond": {
"$eq": [
"$$this._id",
4321// req.params.entryId
]
}
}
},
movies: {
$elemMatch: {
title: "Mongoose Strikes Back"// req.body.title
}
}
})
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365116.html
上一篇:如何加入多個mongoDB集合
