使用C#获取和添加/更新多层嵌入式/嵌套MongoDB文档 [英] Get and Add/Update multilevel embedded/nested MongoDB document using C#

查看:169
本文介绍了使用C#获取和添加/更新多层嵌入式/嵌套MongoDB文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何使用C#进行过滤并添加/更新mongodb文档的第三,第四级子级. 我可以添加/更新到第二级,但不能再进一步.请向我提供解决方案或任何可以从中获得帮助的参考.除了builders..Elemmatch,还有其他方法可以做到这一点.

How can i make filter and add/update third, fourth level child of a mongodb document using C#. I can add/Update till second level but not further. Please provide me a solution or any kind reference from where can get help. Is there any other way to do it except builders..Elemmatch.

这是我的课程和代码:

namespace CrudWithMultilvelNestedDoc
{
    public class Channel
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public string Id { get; set; }
        public string Name { get; set; }
        public Episode[] Episodes { get; set; }
    }

    public class Episode
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public string Id { get; set; }
        public string Name { get; set; }
        public Track[] Tracks { get; set; }
    }

    public class Track
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public string Id { get; set; }
        public string Name { get; set; }
        public Like[] Likes { get; set; }
    }

    public class Like
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public string Id { get; set; }
        public string Name { get; set; }
    }
}

    //First Method
    //var filter = Builders<Channel>.Filter.And(Builders<Channel>
    //                              .Filter.Where(x => x.Id == "5e4606e6ae7b090688671416"), // OR &
    //             Builders<Channel>.Filter.ElemMatch(e => e.Episodes, Builders<Episode>
    //                              .Filter.Eq(e => e.Id, "5e460851d29c1b3df4d27b7d")));

    //Second Method
    //var filter = Builders<Channel>.Filter.Eq(e => e.Id, "5e4606e6ae7b090688671416") 
    //           & Builders<Channel>.Filter.ElemMatch(e => e.Episodes, Builders<Episode>.Filter.Eq(e => e.Id, "5e46071d385a672b0cea0f86"));

    //Third Method
    var filter = channelFilter.ElemMatch(e => e.Episodes, episodeFilter.ElemMatch(e=> e.Tracks, trackFilter.Eq(e => e.Id, "5e460dbe2bc5e70c9cfeac21")));
    var data = collection.Find(filter);         
    //Update Filter
    var update = Builders<Channel>.Update.Push("Episodes[-1].Tracks[-1].Likes", like);
    var result = collection.UpdateOne(filter, update);
//Data 
    {"_id":"5e4606e6ae7b090688671416","Name":"Channel 1","Episodes":[{"_id":"5e46071d385a672b0cea0f86","Name":"Episode 1","Tracks":[{"_id":"5e460dbe2bc5e70c9cfeac21","Name":"Trak 1","Likes":[]},{"_id":"5e4612d60747a2121870c815","Name":"Trak 2","Likes":[]}]},{"_id":"5e460851d29c1b3df4d27b7d","Name":"Episode 2","Tracks":[{"_id":"5e460e307ca6843758ce814e","Name":"Trak 1","Likes":[]}]}]}

推荐答案

按照

位置$运算符不能用于遍历一个以上数组的查询

The positional $ operator cannot be used for queries which traverse more than one array

因此,使用-1并不是这里的解决之道.您应该采用的方法是 $位置过滤运算符.

So using -1 is not a way forward here. The approach you should take is the $ positional filtered operator.

C#中没有强类型的表示形式,因此您的代码如下所示:

There's no strongly-typed representation in C# so your code can look like below:

var filter = Builders<Channel>.Filter.Eq(x => x.Id, "5e4606e6ae7b090688671416");

var like = new Like() {Name = "new like", Id = "1"};
var episodeId = "5e46071d385a672b0cea0f86";
var trackId = "5e460dbe2bc5e70c9cfeac21";

var update = Builders<Channel>.Update.Push("Episodes.$[e].Tracks.$[t].Likes", like);

var arrayFilters = new List<ArrayFilterDefinition>();
ArrayFilterDefinition<BsonDocument> episodesFilter = new BsonDocument("e._id", new BsonDocument("$eq", episodeId));
ArrayFilterDefinition<BsonDocument> tracksFilter = new BsonDocument("t._id", new BsonDocument("$eq", trackId));
arrayFilters.Add(episodesFilter);
arrayFilters.Add(tracksFilter);

var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };

var result = mongoDBCollection.UpdateOne(filter, update, updateOptions);

这篇关于使用C#获取和添加/更新多层嵌入式/嵌套MongoDB文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆