[英]MongoDB C# Get all documents from a list of IDs
我有一個 ID 列表
List<string> Ids;
我想檢索與這些 ID 匹配的所有文檔。
web上有解決辦法:
var ids = new int[] {1, 2, 3, 4, 5};
var query = Query.In("name", BsonArray.Create(ids));
var items = collection.Find(query);
但它們都與舊的 C# 驅動程序和(不再那么新)2.2.4 驅動程序一起使用,API 已更改,我找不到如何構建此查詢。
請看下面的片段(使用LINQPad制作)
void Main()
{
// To directly connect to a single MongoDB server
// or use a connection string
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("test");
var collectionEmpInfo = database.GetCollection<Employee>("Employee");
Employee EmpInfo = new Employee
{
EmpID = "103",
EmpName = "John",
CreatedAt = DateTime.Now,
EmpMobile = new List<Mobile>
{
new Mobile{ MobNumber = "55566610", IsPreferred = true, MobID = ObjectId.GenerateNewId() },
new Mobile{ MobNumber = "55566611", IsPreferred = false, MobID = ObjectId.GenerateNewId() },
}
};
//collectionEmpInfo.InsertOne(EmpInfo);
var filterDef = new FilterDefinitionBuilder<Employee>();
var filter = filterDef.In(x=>x.EmpID , new[]{"101","102"});
filter.Dump();
var empList = collectionEmpInfo.Find(filter).ToList();
empList.Dump();
}
public class Employee
{
public ObjectId Id { get; set; }
public string EmpID { get; set; }
public string EmpName { get; set; }
public List<Mobile> EmpMobile { get; set; }
public DateTime CreatedAt { get; set; }
}
public class Mobile
{
public ObjectId MobID { get; set; }
public string MobNumber { get; set; }
public bool IsPreferred { get; set; }
}
和結果截圖
我最近為此而苦苦掙扎。
使用新的驅動程序 (v2.14.X),這可以通過$in
操作符來實現。 這個 Mongo 鏈接很好地描述了$in
功能。
您可以應用 LINQ 格式:
var ids = new List<string> {"id1", "id2", "etc"};
someMongoCollection.Find(o => o.Any(i => ids.Contains(o.Id));
LINQ 格式運行良好,除非您嘗試將查詢鏈接在一起(即,如果您使用可選數據進行查詢,則使用int[] ages
、 string[] ids
等)。 在這種情況下,您實際上希望根據需要構建查詢。
對於該應用程序,我使用本機 mongo 格式(也在上面的 Mongo 鏈接中進行了描述)。
{ Id: { $in: ["id1", "id2", "etc"] } }
這作為字符串傳遞以創建 BsonDocument,然后將其用作.Find()
操作的過濾器。 您可以根據需要添加更多過濾器。 可以在此鏈接中找到有關傳入數據以創建BsonDocument
對象的更多信息。
請參閱下面的示例代碼片段:
// 1 - init base filter (this fetches everything)
var filter = new BsonDocument();
// 2 - init id data
var ids = new List<string> {"id1", "id2", "etc"};
var idsString = ids.ConvertAll(i => $"\"{i}\"");
// 3 - create the mongo formatted query and generate the BsonDocument
var bsonToParse = $"{{ \"Id\": {{ $in: [{string.Join(",", idsString )}] }} }}";
var idsFilterBson = BsonDocument.Parse(bsonToParse);
// 4 - add the BsonDocument to the already existing filter
filter.Add(idsFilterBson);
// perform steps 2-4 for any other optional query data
// run the final find operation
var dataFromDb = await someMongoCollection.Find(filter).Limit(limit).ToListAsync();
這看起來與您嘗試的當前等效:
var ids = new int[] {1, 2, 3, 4, 5};
var filter = Builders<BsonDocument>.Filter.In("name", ids);
var items = collection.Find(filter);
使用最新的 c# mongo 驅動程序,您還可以利用 LINQ 支持:
var results = this.mongoClient.GetCollection<Employee>()
.AsQueryable()
.Where(x => idList.Contains(x.Id))
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.