C# 使用过滤器和映射查找

C# 使用过滤器和映射查找,c#,mongodb,filter,C#,Mongodb,Filter,我在MongoDB中有以下声明: db.getCollection('Forms').find({"Id": { $nin: db.Forms.find({"Status": "DELETE" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} ) }}) Forms集合是一个仅附加的集合,可以向其写入添加、更新和删除状态记录,此选择的作用是返回集合中没有删除记录的所有表单 问题是:如何使用MongoDB驱动程序编写过滤器?我尝试了以下操作

我在MongoDB中有以下声明:

db.getCollection('Forms').find({"Id": { $nin: db.Forms.find({"Status": "DELETE" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} ) }})
Forms集合是一个仅附加的集合,可以向其写入添加、更新和删除状态记录,此选择的作用是返回集合中没有删除记录的所有表单

问题是:如何使用MongoDB驱动程序编写过滤器?我尝试了以下操作,它返回一个空列表:

new BsonDocument("Id", "{ $nin: db.Forms.find({\"Status\": \"DELETE\" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} ) }");
下面是集合中某些行的示例,我已排除了大多数字段,并在此处选择了相关字段:

/* 1 */{"_id" : ObjectId("55caeb15b33c2d1ff84a618c"),"Id" : "55cae279b33c2d0c2831340c","Status" : "DELETE"}
/* 2 */{"_id" : ObjectId("55cae279b33c2d0c2831340c"),"Id" : "55cae279b33c2d0c2831340c","Status" : "ADD"}
/* 3 */{"_id" : ObjectId("55cae263b33c2d0c2831340b"),"Id" : "55cae21eb33c2d1c187fb2b8","Status" : "DELETE"}
/* 4 */{"_id" : ObjectId("55cae21eb33c2d1c187fb2b8"),"Id" : "55cae21eb33c2d1c187fb2b8","Status" : "ADD"}
/* 5 */{"_id" : ObjectId("55cae200b33c2d1c187fb2b6"),"Id" : "55cae177b33c2d1c187fb2b1","Status" : "DELETE"}
/* 6 */{"_id" : ObjectId("55cae192b33c2d1c187fb2b2"),"Id" : "55cae177b33c2d1c187fb2b1","Status" : "UPDATE"}
/* 7 */{"_id" : ObjectId("55cae177b33c2d1c187fb2b1"),"Id" : "55cae177b33c2d1c187fb2b1","Status" : "ADD"}
/* 8 */{"_id" : ObjectId("55cad0bcb33c2d1040d49d25"),"Id" : "55c9ec2bb33c2d2d04126cf7","Status" : "DELETE"}
/* 9 */{"_id" : ObjectId("55c9f5f0b33c2c27947ef05b"),"Id" : "55c9ec2bb33c2d2d04126cf7","Status" : "UPDATE"}
/* 10 */{"_id" : ObjectId("55c9f5c5b33c2c27947ef05a"),"Id" : "55c9ec2bb33c2d2d04126cf7","Status" : "UPDATE"}
/* 19 */{"_id" : ObjectId("55c9ec2bb33c2d2d04126cf7"),"Id" : "55c9ec2bb33c2d2d04126cf7","Status" : "ADD"}
...
/* 44 */{"_id" : ObjectId("55c32785b33c2c206014caf0"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 45 */{"_id" : ObjectId("55c31762b33c2c235cbef0f9"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 46 */{"_id" : ObjectId("55c31304b33c2c235cbef0e9"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 47 */{"_id" : ObjectId("55c2071fb33c2d0d1ca701fe"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 48 */{"_id" : ObjectId("55c1ee9db33c2d2090685c29"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 49 */{"_id" : ObjectId("55c1e267b33c2d2090685bff"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
/* 50 */{"_id" : ObjectId("55c1b2eeb33c2c1f0cb151c2"),"Id" : "55c08ea1b33c2d24f0aaf697","Status" : "UPDATE"}
因此,select需要排除所有表单,而不是包含删除项的行-即,只要表单有删除记录,就必须将其从列表中排除

澄清一下:_id字段是每行的唯一id,id是我在select中使用的表单的id

编辑:尽管@BlakesSeven建议的重复答案向我解释了我不能像我尝试的那样内联调用函数,但问题仍然存在:如何使用MongoDB C驱动程序将这行代码编写为MapReduce:


MongoShell是一个非常高级的MongoDB客户端。 在本例中,它为您执行两个查询,而不是一个查询。 作为证明,您可以浏览执行计划,它们将是相等的。查询的格式为可读性:

db.getCollection('Forms')
    .find({"Id": { $nin: db.Forms.find({"Status": "DELETE" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} )}})
    .explain()


因此,您需要在客户端执行同样的操作:首先查询excludedIds,然后基于excludedIds创建一个过滤器,然后再次查询表单集合。

Mongo shell是一个非常高级的MongoDB客户端。 在本例中,它为您执行两个查询,而不是一个查询。 作为证明,您可以浏览执行计划,它们将是相等的。查询的格式为可读性:

db.getCollection('Forms')
    .find({"Id": { $nin: db.Forms.find({"Status": "DELETE" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} )}})
    .explain()


因此,您需要在客户端执行同样的操作:首先查询excludedIds,然后基于excludedIds创建一个过滤器,然后再次创建查询表单集合。

您能解释一下为什么您的建议显然不起作用吗?@CodeCaster:抱歉,这有点不清楚:它只返回一个空列表,即过滤器本身不返回任何内容。我将编辑问题以使其更清楚。您的状态字段是数组吗?是否有理由先选择Id,然后按Id过滤,而不是立即按状态过滤?@FireAlkazar:No,每个表单可以有多行不同的状态-因此同一表单可以有五行相同的Id,但状态不同,即添加时的第一行,然后对其进行更新,如果相关,最后进行删除。一旦插入了删除行,我想从列表中排除该表单。我希望这有意义?我将列出一个列表,以快速显示数据。当您的问题被否决时,您必须理解我在这里的立场,因为这实际上只是您和其他人对流程的误解。所以不要生气,即使这是无可否认的愤怒,因为为什么人们仍然不理解这一点。因此,我建议重新阅读这里给出的答案,直到它被理解为止。您看到的是,shell是一个查询操作的结果,因为shell允许在另一个语句中作为参数使用时,像变量一样被转换为表单。它们不嵌入。这就是所说的。你能解释一下为什么你的建议显然不起作用吗?@CodeCaster:对不起,这有点不清楚:它只返回一个空列表,即过滤器不会返回任何内容。我将编辑问题以使其更清楚。您的状态字段是数组吗?是否有理由先选择Id,然后按Id过滤,而不是立即按状态过滤?@FireAlkazar:No,每个表单可以有多行不同的状态-因此同一表单可以有五行相同的Id,但状态不同,即添加时的第一行,然后对其进行更新,如果相关,最后进行删除。一旦插入了删除行,我想从列表中排除该表单。我希望这有意义?我将列出一个列表,以快速显示数据。当您的问题被否决时,您必须理解我在这里的立场,因为这实际上只是您和其他人对流程的误解。所以不要生气,即使这是无可否认的愤怒,因为为什么人们仍然不理解这一点。因此,我建议重新阅读这里给出的答案,直到它被理解为止。您看到的是,shell是一个查询操作的结果,因为shell允许在另一个语句中作为参数使用时,像变量一样被转换为表单。它们不嵌入。这就是所说的。
var excludedIds = db.Forms.find({"Status": "DELETE" }, {_id:0, Id:1}).map(function (fr) { return fr.Id;} )
db.getCollection('Forms')
    .find({"Id": { $nin: excludedIds }})
    .explain()