Insert element into nested array in Mongodb

前端 未结 3 1917
孤街浪徒
孤街浪徒 2021-01-04 09:39

I have this :

{
  \"_id\" : ObjectId(\"4fb4fd04b748611ca8da0d48\"),
  \"Name\" : \"Categories\",
  \"categories\" : [{
      \"_id\" : ObjectId(\"4fb4fd04b74         


        
相关标签:
3条回答
  • 2021-01-04 10:00

    Adding an example for my case. Did work but without the dollar sign when entering inside an array:

    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);
            }
    
    0 讨论(0)
  • 2021-01-04 10:01

    You can do this using FindOneAndUpdateAsync and positional operator

    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);
    }
    
    0 讨论(0)
  • 2021-01-04 10:15

    You can use the positional operator using Linq expressions too:

    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);
    }
    

    And get yourself free of using hard-coded property names inside strings.

    0 讨论(0)
提交回复
热议问题