我试着做下面的问题。
1.查找2022年出版的图书的ISBN和书名。
1.找到ISBN,书名和出版商的书籍,有至少两个作者和最多三个作者。
MongoDB subject.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()
3条答案
按热度按时间e7arh2l61#
Q1:带点符号的过滤器:“主题.书籍.年鉴”
Demo Q1 @ Mongo Playground
已更新:用于筛选数组中的文档
Demo Q1.1 @ Mongo Playground
Q2:我怀疑您没有正确观察结果。
subject.book.author.3
将返回subject.book.author
数组中的第四个元素,因为索引从0开始。对于您当前的查询,它将返回包含
subject.book.author
数组中第三和第四个元素的文档,这意味着只要数组包含超过2个元素,文档就会被返回。相反,您需要
$size
操作符来获取数组的大小。虽然有些文档没有book
属性,但请使用$ifNull
返回空数组,以防止在使用$size
时出错。Demo Q2 @ Mongo Playground
已更新:用于筛选数组中的文档
Demo Q2.1 @ Mongo Playground
注意:您将太多的问题附加到一个问题中。请记住,当您以后提出新问题时,请将其拆分为不同的问题(帖子)。
kqlmhetl2#
对于问题2,由于Yong Shun提到数组从0开始,我相应地编辑了代码。如果你想把每一本书作为一个单独的记录来收集,你需要把它们展开到书的级别。我希望这能回答你的问题。我也是MongoDB的新手,所以如果它没有按预期工作,请告诉我。
单击Q2 MongoDB Playground
avkwfej43#
您也可以使用
$filter
代替$unwind
:Mongo Playground