使用C#驱动程序从MongoDB获取指定顺序的文档。
使用C#驱动程序从MongoDB获取指定顺序的文档。
我是MongoDB的新手,想知道是否可以按照我在数组中指定的顺序通过Id获取文档。我正在使用官方的C#驱动程序。
问题描述:
我有一些集合中的文档,如下所示:
{
"_id" : "1",
"Name" : "Assignment 1"
}
到
{
"_id" : "100",
"Name" : "Assignment 100"
}
我有一个Id数组 { "4", "19", "10", "6" },我需要按照数组中的顺序获取文档。
我尝试了以下查询:
{ "_id" : { "$in" : ["4", "19", "10", "6"] } }
{ "$or" : [{ "_id" : "4" }, { "_id" : "19" }, { "_id" : "10" }, { "_id" : "6" }] }
但是这两个查询都以以下顺序返回文档:
(图片无法翻译,请参考原文)
但是我期望的结果是:
(图片无法翻译,请参考原文)
我目前唯一的选择是为数组中的每个元素进行单独的数据库请求,但我认为这是一个不好的选择。
请问有没有人能够指导我如何按照我在数组中指定的顺序获取文档。我正在使用MongoDB的C#驱动程序,希望得到基于C#的答案。
谢谢,
Kapil
问题的出现原因是需要从MongoDB中获取特定顺序的文档,但目前的代码实现并没有按照指定顺序获取文档。解决方法是使用聚合框架来实现按照指定顺序获取文档的功能。
以下是使用C#驱动程序从MongoDB中按照指定顺序获取文档的代码示例:
string[] fetchingIds = { "4", "19", "10", "6" }; IMongoQuery fetchQuery = Query.In(x => x.Id, fetchingIds); BsonDocument match = new BsonDocument { { "$match", fetchQuery.ToBsonDocument() } }; BsonDocument currentDocument = null; BsonDocument finalDocument = null; BsonValue processingDocument = null; for (int i = 0; i < fetchingIds.Length; i++) { BsonElement ifStatement = new BsonElement("$eq", new BsonArray(new[] { "$_id", fetchingIds[i] })); BsonArray conditionStatement = new BsonArray(new[] { new BsonDocument(ifStatement), BsonValue.Create(i + 1), -1 }); currentDocument = new BsonDocument("$cond", conditionStatement); if (finalDocument == null) { finalDocument = currentDocument; } else { processingDocument = null; BsonValue tempDoc = finalDocument["$cond"][2] as BsonDocument; if (tempDoc == null) { processingDocument = finalDocument["$cond"]; } while (tempDoc != null) { if ((tempDoc["$cond"][2] as BsonDocument) == null) { processingDocument = tempDoc["$cond"]; tempDoc = null; } else { tempDoc = tempDoc["$cond"][2]; } } processingDocument[2] = currentDocument; } } BsonDocument project = new BsonDocument { { "$project", new BsonDocument { // this will return whose document {"obj","$$ROOT"}, {"weight",finalDocument}, } } }; BsonDocument sort = new BsonDocument { { "$sort", new BsonDocument { { "weight", 1 } } } }; var result = assignmentCollection.Aggregate(new AggregateArgs { Pipeline = new[] { match, project, sort }, }).ToList();
通过使用聚合框架,我们可以按照指定顺序从MongoDB中获取文档。首先,使用`Query.In`方法创建一个查询,用于获取特定ID的文档。然后,创建一个`$match`操作符的BsonDocument,将查询作为参数传递给它。接下来,使用循环遍历指定的ID列表,并创建一个`$cond`操作符的BsonDocument,将其添加到一个最终的BsonDocument中。最后,创建一个`$project`操作符的BsonDocument,将包含原始文档和权重字段的BsonDocument作为参数传递给它。然后,创建一个`$sort`操作符的BsonDocument,按照权重字段对文档进行排序。最后,使用聚合框架的`Aggregate`方法执行聚合操作,并将结果转换为一个列表。
这样,我们就可以按照指定顺序从MongoDB中获取文档了。