MongoDB -家庭作业帮助,不确定如何在mongoDB中访问文档中的变量

dw1jzc5e  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(114)

我试着做下面的问题。
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()
yruzcnhs

yruzcnhs1#

Q1:带点符号的过滤器:“主题.书籍.年份酒吧”

db.Subject.aggregate([
  {
    "$unwind": "$subject.book"
  },
  {
    "$match": {
      "subject.book.yearPub": 2022
    }
  },
  {
    "$project": {
      "subject.book.ISBN": 1,
      "subject.book.bookTitle": 1
    }
  }
])

Demo 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
    }
  }
])

Demo 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
    }
  }
])

Demo 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
    }
  }
])

Demo Q2.1 @ Mongo Playground

注意:您将太多问题附加到一个问题中。请记住,当您以后提出新问题时,请将其拆分为不同的问题(帖子)。

rt4zxlrg

rt4zxlrg2#

对于问题2,由于Yong Shun提到数组从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

tuwxkamq

tuwxkamq3#

您也可以使用$filter来代替$unwind

db.collection.aggregate([
  {
    $match: {
      "subject.book": { $exists: true }
    }
  },
  {
    "$project": {
      book: {
        $filter: {
          input: "$subject.book",
          cond: { $eq: [ "$$this.yearPub", 2022 ] }
        }
      }
    }
  }
])

Mongo Playground

相关问题