【问题标题】:How check value existence in a deeply nested array in MongoDB.Driver C#?如何在 MongoDB.Driver C# 中检查深度嵌套数组中的值存在?
【发布时间】:2021-06-05 03:28:45
【问题描述】:

如下图,集合为Posts。帖子和评论的_ids 是已知的。

那么,如何检查给定值d 是否存在于AgreedUserIds 中?

【问题讨论】:

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


    【解决方案1】:

    试试这个进行单字符搜索:

    db.Posts.find(
        {
            _id: "b4d5...ff79",
            Comments: {
                $elemMatch: {
                    _id: "c1ea...d45",
                    AgreedUserIds: "d"
                }
            }
        }
    );
    

    这用于多字符搜索:

    db.Posts.find(
        {
            _id: "b4d5...ff79",
            Comments: {
                $elemMatch: {
                    _id: "c1ea...d45",
                    AgreedUserIds: { $in: ["c", "d"] }
                }
            }
        }
    );
    

    【讨论】:

    • AgreedUserIds 本身就是一个数组。 AgreedUserIds 需要额外的 $elemMatch 吗?
    • 没有。它是一个字符数组,因此不需要。
    • 抱歉我的误导。 AgreedUserIds 允许包含比单个字符更长的字符串。
    • 仅当数组包含对象时使用$elemMatch
    • $in 运算符选择字段值等于指定数组中任何值的文档。 AgreedUserIds: { $in: ["c", "d"] } 应该表示 AgreedUserIds=="c" || AgreedUserIds=="d" 而不是 "c" in AgreedUserIds || "d" in AgreedUserIds
    【解决方案2】:

    如果你想保留它BsonDocument,你可以选择像这样组合过滤器>

    var client = new MongoClient();
    var database = client.GetDatabase("test");
    var collection = database.GetCollection<BsonDocument>("posts");
    var postId = new BsonObjectId(new ObjectId("604b5ff389ff6887d1b91a93"));
    var commentId = new BsonObjectId(new ObjectId("604b5ff389ff6887d1b91a92"));
    var userId = "a";
    //var userId = "e"; // not found
    var postIdMatches = Builders<BsonDocument>.Filter.Eq("_id", postId);
    var commentIdMatches = Builders<BsonDocument>.Filter.Eq("_id", commentId);
    var userIdInside = Builders<BsonDocument>.Filter.AnyEq("AgreedUserIds", userId); // "a" in checking
    var commentCheck = Builders<BsonDocument>.Filter.ElemMatch("Comments", userIdInside & commentIdMatches); // & combines filters. Also ElemMatch on any of the Comments is passing the criteria
    var rows = (await collection.FindAsync<BsonDocument>(postIdMatches & commentCheck)).ToList(); 
    

    您还可以GetCollection&lt;Post&gt; 使用描述 Post 业务对象的 C# Post 类,并对其使用 .Any Linq 查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2020-12-10
      • 2022-06-22
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多