簡體   English   中英

MongoDB 在子文檔中找到

[英]MongoDB find among subdocuments

我有一堆文檔,其中每個文檔都以這種方式格式化:

{
  "faculty": "Some Faculty",
  "students": [
      {
        "id": "51230867123",
        "age": "21",
        "name": "awdawdawdawawd"
      },
      {
        "id": "0217356102",
        "age": "22",
        "name": "awdawd"
      },
      ...
      ]
}

我已經使用insertMany([...])將這些文檔插入到單個 MongoDB 集合中,所以現在我的students表如下所示:

{
  "faculty": "Some Faculty",
  "students": [
      {
        "id": "51230867123",
        "age": "21",
        "name": "John Doe"
      },
      {
        "id": "0217356102",
        "age": "22",
        "name": "Jane Doe"
      },
      ...
      ]
},
{
  "faculty": "Other Faculty",
  "students": [
      {
        "id": "1240876124",
        "age": "21",
        "name": "Jimmy Doe"
      },
      {
        "id": "2309857120578",
        "age": "22",
        "name": "Johnny Doe"
      },
      ...
      ]
},
...

我非常想知道如何對某些子文檔(尤其是students )執行find查詢。 例如,我想find所有students.namestudents.age > 23 我嘗試了很多查詢,包括db.students.find({"students.age": {$gt: /.*B.*/}}, {_id: 0, "students.name": 1}) ,但是這樣的查詢總是返回至少一個學生滿足條件的整個文檔。 我想查詢個別學生。 這可以使用find (無aggregate )嗎?

使用aggregate ,可以使用unwrap ,這正是我需要做的。 然而,我希望find一些技巧來實現這種行為。

您可以在 find 和 findOne 方法的投影中使用聚合運算符,從 MongoDB 4.2 開始,

  • $filter迭代學生數組的循環並檢查所需條件,它將返回過濾結果
  • $map迭代上述過濾結果的循環並僅返回name
db.collection.find(
  { "students.age": { $gt: "23" } },
  {
    "students": {
      $map: {
        input: {
          $filter: {
            input: "$students",
            cond: { $gt: ["$$this.age", "23"] }
          }
        },
        in: "$$this.name"
      }
    }
  }
)

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM