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游乐场