如何在mongodb中访问文档中的变量?

fxnxkyjh  于 2023-03-01  发布在  Go
关注(0)|答案(3)|浏览(143)

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

e7arh2l61#

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

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

kqlmhetl

kqlmhetl2#

对于问题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

avkwfej4

avkwfej43#

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

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

Mongo Playground

相关问题