簡體   English   中英

MongoDB C# 從ID列表中獲取所有文檔

[英]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; }
}

和結果截圖

linquPaDscreenShot

我最近為此而苦苦掙扎。

使用新的驅動程序 (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[] agesstring[] 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM