我试着做下面的问题。
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条答案
按热度按时间yruzcnhs1#
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
注意:您将太多问题附加到一个问题中。请记住,当您以后提出新问题时,请将其拆分为不同的问题(帖子)。
rt4zxlrg2#
对于问题2,由于Yong Shun提到数组从0开始,我已经相应地编辑了代码。同样,如果你想收集每本书作为一个单独的记录,你需要把它们展开到书的级别。我希望这能回答你的问题。我也是MongoDB的新手,所以如果它没有按预期工作,请告诉我。
单击Q2 MongoDB Playground
tuwxkamq3#
您也可以使用
$filter
来代替$unwind
:Mongo Playground