【发布时间】:2021-06-05 03:28:45
【问题描述】:
【问题讨论】:
标签: c# mongodb mongodb-.net-driver
【问题讨论】:
标签: c# mongodb mongodb-.net-driver
试试这个进行单字符搜索:
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。
如果你想保留它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<Post> 使用描述 Post 业务对象的 C# Post 类,并对其使用 .Any Linq 查询。
【讨论】: