使用C#驱动程序从MongoDB获取指定顺序的文档。

25 浏览
0 Comments

使用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

0
0 Comments

问题的出现原因是需要从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中获取文档了。

0