我正在尝试做以下问题。
1.查找2022年出版的图书的ISBN和书名。
1.查找至少有两个作者、最多有三个作者的图书的ISBN、书名和出版商。
MongoDB subject.js
对于第一个问题,我试过了:我想尝试使用$eq
,但我不太确定如何使用,所以我尝试使用$elemMatch
,但似乎我也不知道它是如何工作的。
db.Subject.aggregate( [
{"$unwind":"$subject.book"},
{"$match":{"subject.book":{"$elemMatch":{"subject.yearPub":2022}} }},
{"$project":{"subject.book.ISBN":1,"subject.book.bookTitle":1 }}
])
对于第二个问题,我试过了:到目前为止,这本书给了我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条答案
按热度按时间emeijp431#
Q1:带点标记的过滤器:“subject.book.yearPub”
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
**注意:您将太多问题添加到一个问题中。请记住,当你在未来提出一个新的问题时,请将其拆分为不同的问题(帖子)。
9o685dep2#
对于问题2,由于Yong Shun提到数组从0开始,因此我相应地编辑了代码。以及如果你想收集每本书作为一个单独的记录,你将需要展开他们的书籍水平。我希望这能回答你的问题。我也是MongoDB的新手,所以如果它没有按预期工作,请告诉我。
单击Q2 MongoDB Playground
knpiaxh13#
除了
$unwind
,你也可以使用$filter
:Mongo Playground