【问题标题】:Insert element into nested array in Mongodb将元素插入到MongoDB中的嵌套数组中
【发布时间】:2015-08-24 05:55:41
【问题描述】:

我有这个:

{
  "_id" : ObjectId("4fb4fd04b748611ca8da0d48"),
  "Name" : "Categories",
  "categories" : [{
      "_id" : ObjectId("4fb4fd04b748611ca8da0d46"),
      "name" : "SubCategory",
      "sub-categories" : [{
          "_id" : ObjectId("4fb4fd04b748611ca8da0d47"),
          "name" : "SubSubCategory",
          "standards" : []
        }]
    }]
}

我想使用 C# 驱动程序添加一个新的 SubCategory。有没有最佳的方法来做到这一点?

【问题讨论】:

    标签: c# mongodb insert driver mongodb-.net-driver


    【解决方案1】:

    您可以使用FindOneAndUpdateAsync 和位置运算符来做到这一点

    public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
    {
        var filter = Builders<Product>.Filter.And(
             Builders<Product>.Filter.Where(x => x.Id == productId), 
             Builders<Product>.Filter.Eq("Categories.Id", categoryId));
        var update = Builders<Product>.Update.Push("Categories.$.SubCategories", newSubCategory);
        await collection.FindOneAndUpdateAsync(filter, update);
    }
    

    【讨论】:

    • 不错!但是如果数组还不存在呢?有没有办法在这里创建然后推送?
    【解决方案2】:

    您也可以通过 Linq 表达式使用位置运算符:

    public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
    {
        var filter = Builders<Product>.Filter.And(
             Builders<Product>.Filter.Where(x => x.Id == productId), 
             Builders<Product>.Filter.ElemMatch(x => x.Categories, c => c.Id == categoryId));
        var update = Builders<Product>.Update.Push(x => x.Categories[-1].SubCategories, newSubCategory);
        await collection.FindOneAndUpdateAsync(filter, update);
    }
    

    让自己摆脱在字符串中使用硬编码的属性名称。

    【讨论】:

    【解决方案3】:

    为我的案例添加一个示例。输入数组时确实有效,但没有美元符号:

    public async Task AddCustomMetadata()
           {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("EntityCustomMetadataFieldId", "5bf81296-feda-6447-b45a-08d5cb91211c");
                var filter = Builders<BsonDocument>.Filter.Eq("_id", "6c7bb4a5-d7cc-4a8d-aa92-b0c89ea0f7fe");
                var update = Builders<BsonDocument>.Update.Push("CustomMetadata.Fields", dic);
                await _context.BsonAssets.FindOneAndUpdateAsync(filter, update);
            }
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2015-04-02
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      相关资源
      最近更新 更多