簡體   English   中英

MongoDB 和 C# 驅動程序:如何過濾嵌套對象數組中的字段

[英]MongoDB with C# Driver: How to filter on field within nested array of objects

我是 MongoDB 的新手,一直在努力解決這個問題。 假設我有一個包含 ID、名稱和對象數組的文檔:

{
    "_id": {
        "$oid": "614ba49b46727413d60b99e2"
    },
    "Name": 1,
    "ObjectArray": [
    {
        "ObjectId": {
            "$oid": "614ba49b46727413d60b99e3"
        },
        "Value": "some value", 
    }, 
    {
        "ObjectId": {
            "$oid": "614ba49b46727413d60b99e5"
        },
        "Value": "other value",
    }
    ],
}

我有一個映射到該文檔的 C# class,在這方面一切正常。 假設我想在 object 數組中添加另一個 object,只有當新對象的 ID 不存在於數組中時? 我正在為此使用 C# 驅動程序並嘗試了幾件事。

我嘗試了幾個想法,包括以下 -

var filter = FilterBuilder.Eq(x => x.Id, id) & 
             FilterBuilder.Nin(x => x.ObjectArray[-1].ObjectId, new[] { newDoc.ObjectId});

不幸的是,這只檢查 object 數組中的第一個 object。 因此,如前所述,如果條件全部存在於一個過濾器中,我如何只向數組添加一個新的 object?

謝謝你的時間。

*** 解決方案 ***

將 Elematch 與 Not 結合使用,將過濾全部合二為一。

var filter = FilterBuilder.Eq(x => x.Id, id) & 
            FilterBuilder.Not(FilterBuilder.ElemMatch(x => x.ObjectArray, 
                 Builders<ObjectClass>.Filter.Eq(y => y.ObjectId, newDoc.ObjectId)));

您可以使用$elemMatch訪問和過濾嵌套屬性。 並將該值與$eq進行比較。

{
  "ObjectArray": {
    $elemMatch: {
      "ObjectId": {
        $eq: <value>
      }
    }
  }
}

完成MongoDB聚合查詢

db.collection.aggregate([
  {
    $match: {
      $and: [
        {
          "_id": {
            // With Exist _id
            $eq: ObjectId("614ba49b46727413d60b99e2")
          }
        },
        {
          "ObjectArray": {
            $elemMatch: {
              "ObjectId": {
                // With unexist ObjectArray.ObjectId
                $eq: ObjectId("614ba49b46727413d60b99e3")
              }
            }
          }
        }
      ]
    }
  }
])

示例 Mongo 游樂場

對於 MongoDB .NET/C# 驅動程序

var filter = FilterBuilder.Eq(x => x.Id, id) & 
             FilterBuilder.ElemMatch(x => x.ObjectArray, 
                 Builders<ObjectClass>.Filter.Eq(y => y.ObjectId, newDoc.ObjectId);

ObjectClass替換為ObjectArray中 Object 的 class 名稱。

備注:

通過上述解決方案,當ObjectArray中存在解析的ObjectId時,它將返回文檔。 因此,您應該對現有的ObjectId案例進行處理

並且只有在沒有查詢到文檔時才將文檔添加到ObjectArray中。


參考

  1. $elemMatch
  2. 使用 MongoDB .NET/C# 驅動程序過濾數組中文檔的類似場景

暫無
暫無

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

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