如何使用C#驱动程序在MondoDB中编写一个强类型查询过滤器,其中一个数组是子数组或等于另一个数组


Model:
{
_id: "1025",
CandidateName: "John"
Activities:["Programming", "Gaming"]
}
ChoicheOfActivities = ["Programming", "Gaming", "Singing", "Acting"];
Candidate1 = {_id:"1", Name: "John", Activities: ["Programming", "Gaming"]};
Candidate2 = {_id:"2", Name: "Mike", Activities: ["Programming", "Singing"]};
Candidate3 = {_id:"3", Name: "Joey", Activities: ["Gaming","Programming",  "Singing", "Acting"]};
Candidate4 = {_id:"4", Name: "Ross", Activities: ["Programming", "Kayaking"]};

我想筛选那些活动低于或等于ChoiceOfAtivities的候选人。在应用过滤器后,我希望结果是

Candidate1 = {_id:"1", Name: "John", Activities: ["Programming", "Gaming"]};
Candidate2 = {_id:"2", Name: "Mike", Activities: ["Programming", "Singing"]};
Candidate3 = {_id:"3", Name: "Joey", Activities: ["Gaming","Programming", "Singing", "Acting"]};

Candidate3将不会被选择,因为它具有活动";皮划艇";这不在艺术选择中。

注意:我想在不在列表或枚举上进行筛选时应用此方法。

@varman查询是正确的,但是,这就是我们将其表示为C#/.NET 的方式

我们首先要创建一个表示文档的类:

class Candidate
{
public string Id { get; set; }
public string Name { get; set; }
public string[] Activities { get; set; }
}

然后,为了开始工作,我们只需连接到mongo,并将您的样本数据插入到测试数据库中。

var client = new MongoClient();
var db = client.GetDatabase("test");
var collection = db.GetCollection<Candidate>("candidates");
var candidate1 = new Candidate { Id = "1", Name = "John", Activities = new[] { "Programming", "Gaming" } };
var candidate2 = new Candidate { Id = "2", Name = "Mike", Activities = new[] { "Programming", "Singing" } };
var candidate3 = new Candidate { Id = "3", Name = "Joey", Activities = new[] { "Gaming", "Programming", "Singing", "Acting" } };
var candidate4 = new Candidate { Id = "4", Name = "Ross", Activities = new[] { "Programming", "Kayaking" } };
await collection.InsertManyAsync(new[]
{
candidate1,
candidate2,
candidate3,
candidate4
});

现在我们将使用过滤器生成器来构建一些过滤器。

var choiceOfActivities = new[] {"Programming", "Gaming", "Singing", "Acting"};

var filter = Builders<Candidate>.Filter.Not(
Builders<Candidate>.Filter.ElemMatch(candidate => candidate.Activities,
new BsonDocument("$nin", BsonArray.Create(choiceOfActivities))));

然后我们可以对我们的集合执行查找并获得结果

var results = await collection.Find(filter)
.ToListAsync();
foreach (var result in results)
{
Console.WriteLine($"{result.Id}, {result.Name}, {string.Join(" + ", result.Activities)}");
}
// 1, John, Programming + Gaming
// 2, Mike, Programming + Singing
// 3, Joey, Gaming + Programming + Singing + Acting

你可以这样做

db.collection.find({
Activities: {
$not: {
"$elemMatch": {
$nin: [
"Programming",
"Gaming",
"Singing",
"Acting"
]
}
}
}
})

工作Mongo游乐场

最新更新