我正在嘗試做以下問題。
查找 2022 年出版的書籍的 ISBN 和書名。
找到至少有兩位作者和最多三位作者的圖書的 ISBN、書名和出版商。
MongoDB 主題.js
對于問題 1,我嘗試過:我想嘗試使用$eq,但我不太確定如何使用,所以我嘗試使用$elemMatch,但似乎我也不知道它是如何作業的。
db.Subject.aggregate( [
{"$unwind":"$subject.book"},
{"$match":{"subject.book":{"$elemMatch":{"subject.yearPub":2022}} }},
{"$project":{"subject.book.ISBN":1,"subject.book.bookTitle":1 }}
] )
對于問題 2,我已經嘗試過:到目前為止,它為我提供了 3 位作者的書籍。但由于某種原因,它錯過了有 2 個作者的書。
db.Subject.aggregate([{"$match": {"$or": [{'subject.book.author.3': {"$exists": true}},
{'book.author.2': {"$exists": true}}]}},
{"$project": {"subject.book.ISBN": 1,"subject.book.bookTitle": 1,"subject.book.publisher": 1,"_id":0}}
]).pretty()
uj5u.com熱心網友回復:
Q1:用點符號過濾:“subject.book.yearPub”
db.Subject.aggregate([
{
"$unwind": "$subject.book"
},
{
"$match": {
"subject.book.yearPub": 2022
}
},
{
"$project": {
"subject.book.ISBN": 1,
"subject.book.bookTitle": 1
}
}
])
演示 Q1 @ Mongo Playground
更新:過濾陣列中的檔案
db.collection.aggregate([
{
"$match": {
"subject.book.yearPub": 2022
}
},
{
$set: {
"subject.book": {
$filter: {
input: "$subject.book",
cond: {
$eq: [
"$$this.yearPub",
2022
]
}
}
}
}
},
{
"$project": {
"subject.book.ISBN": 1,
"subject.book.bookTitle": 1
}
}
])
演示 Q1.1 @ Mongo Playground
Q2:我懷疑你觀察到的結果不正確。subject.book.author.3將回傳subject.book.author陣列中的第四個元素,因為索引從 0 開始。
對于您當前的查詢,它將回傳包含陣列中第三個和第四個元素的檔案,subject.book.author這意味著只要陣列包含超過 2 個元素,就會回傳該檔案。
相反,您需要$size運算子來獲取陣列的大小。雖然有檔案沒有該book屬性,所以使用$ifNull回傳空陣列以防止使用時出錯$size。
db.Subject.aggregate([
{
"$match": {
$expr: {
$in: [
{
$size: {
$ifNull: [
"$subject.book.author",
[]
]
}
},
[
2,
3
]
]
}
}
},
{
"$project": {
"subject.book.ISBN": 1,
"subject.book.bookTitle": 1,
"subject.book.publisher": 1,
"_id": 0
}
}
])
演示 Q2 @ Mongo Playground
更新:過濾陣列中的檔案
db.collection.aggregate([
{
"$match": {
$expr: {
$in: [
{
$size: {
$ifNull: [
"$subject.book.author",
[]
]
}
},
[
2,
3
]
]
}
}
},
{
$set: {
"subject.book": {
$filter: {
input: "$subject.book",
cond: {
$in: [
{
$size: {
$ifNull: [
"$subject.book.author",
[]
]
}
},
[
2,
3
]
]
}
}
}
}
},
{
"$project": {
"subject.book.ISBN": 1,
"subject.book.bookTitle": 1,
"subject.book.publisher": 1,
"_id": 0
}
}
])
演示 Q2.1 @ Mongo Playground
注意:您將太多問題合并為一個。當您將來提出新問題時,請記住將其拆分為不同的問題(帖子)。
uj5u.com熱心網友回復:
對于問題 2,由于永順提到陣列從 0 開始,我已經編輯了相應的代碼以適應。以及如果您想將每本書作為單獨的記錄收集,您需要將它們展開到書籍級別。我希望這回答了你的問題。我也是 MongoDB 的新手,所以如果它沒有按預期作業,請告訴我。
db.collection.aggregate([
{
"$unwind": "$subject.book"
},
{
"$match": {
"$or": [
{
"subject.book.author.2": {
"$exists": true
}
},
{
"subject.book.author.1": {
"$exists": true
}
}
]
}
},
{
"$project": {
"subject.book.ISBN": 1,
"subject.book.bookTitle": 1,
"subject.book.publisher": 1,
"_id": 0
}
}
])
點擊Q2 MongoDB Playground
uj5u.com熱心網友回復:
而不是$unwind你也可以使用$filter:
db.collection.aggregate([
{
$match: {
"subject.book": { $exists: true }
}
},
{
"$project": {
book: {
$filter: {
input: "$subject.book",
cond: { $eq: [ "$$this.yearPub", 2022 ] }
}
}
}
}
])
蒙戈游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533248.html
