Arrays MongoDB是否使用两个输入数组值执行$match?

Arrays MongoDB是否使用两个输入数组值执行$match?,arrays,mongodb,aggregation-framework,Arrays,Mongodb,Aggregation Framework,在MongoDB中,我试图编写一个查询,其中有两个输入数组Bills,name,其中第一个包含billids,第二个包含人名。实际上,索引i处的账单和索引i处的名称是我们要在MongoDB中搜索的实际文档 我想写一个查询,使得Bills[I]=db\u billid&&Names[I]=db\u name,这意味着我想返回billid和name在特定索引处匹配的结果 我想在中使用$in,但问题是我可以在账单中应用$in,但我不知道在哪个索引中找到billid {$and:[{billid:{$i

在MongoDB中,我试图编写一个查询,其中有两个输入数组
Bills
name
,其中第一个包含billids,第二个包含人名。实际上,索引
i
处的账单和索引
i
处的名称是我们要在MongoDB中搜索的实际文档

我想写一个查询,使得Bills[I]=db\u billid&&Names[I]=db\u name,这意味着我想返回billid和name在特定索引处匹配的结果

我想在
中使用
$in
,但问题是我可以在
账单中应用
$in
,但我不知道在哪个索引中找到billid

{$and:[{billid:{$in:Bills}},{name:Names[**找到此票据的索引]}]}

有谁能帮我解决这个问题吗

MongoDB模式

var transactionsschema = new Schema({
    transactionid: {type: String},
    billid: {type: String},
    name: {type: String}
});
MongoDB中的示例文档

{ _id: XXXXXXXXXXX, transactionid: 1, billid : bnb1234, name: "sudhanshu"}, { _id: XXXXXXXXXXX, transactionid: 2, billid : bnb1235, name: "michael"}, { _id: XXXXXXXXXXX, transactionid: 3, billid : bnb1236, name: "Morgot"}
样本数组

Bills = ["bill1", "bill2", "bill3"], Names = ["name1", "name2", "name"]
编辑-如果$in可以在对象数组中工作,那么我可以拥有对象数组,其中键为billid和name

var arr=[{billid:“bill1”,“name”:“name1”},{billid:“bill2”,“name”:“name2”},{billid:“bill3”,“name”:“name3”}]

但问题是,那怎么能把下面的问题提出来呢


{$and:[{billid:{$in:arr.Bills}},{name:arr.Names}}
知道
账单是唯一的,但是
名称
可能有重复项,您可以使用它来获取匹配的
账单
的索引,然后使用该索引来比较评估索引处的
名称
数组(用于检索值)。您还必须检查
$indexOfArray
返回的值是否不等于
-1
(不匹配)

或者,可以使用以下方法避免重复:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $let: {
                    vars: { index: { $indexOfArray: [ bills, "$billid" ] } },
                    in: { $and: [ { $ne: [ "$$index", -1 ] }, { $eq: [ "$name", { $arrayElemAt: [ names, "$$index" ] }] }]}
                }
            }
        }
    }
])

知道
票据
是唯一的,但是
名称
可能有重复项,您可以使用该索引获取匹配的
票据
的索引,然后使用该索引在评估索引处比较
名称
数组(用于检索值)。您还必须检查
$indexOfArray
返回的值是否不等于
-1
(不匹配)

或者,可以使用以下方法避免重复:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $let: {
                    vars: { index: { $indexOfArray: [ bills, "$billid" ] } },
                    in: { $and: [ { $ne: [ "$$index", -1 ] }, { $eq: [ "$name", { $arrayElemAt: [ names, "$$index" ] }] }]}
                }
            }
        }
    }
])

您可以添加示例文档、示例账单和名称吗?@mickl wait让我添加它。@mickl我已经添加了示例文档。您可以添加示例文档、示例账单和名称吗?@mickl wait让我添加它。@mickl我已经添加了示例文档。假设我有两个嵌套查询,第一个是我的,第二个是您给出的解决方案,如“$match:{$and:{“transactionid”:“12345678”},{您的查询}},现在可以运行了吗?这是否正确嵌套了?您可以向
$match
添加更多条件,如
{$and:[{$ne:[“$billIndex”,-1]},{$ne:[“$nameIndex”,-1]},{$eq:[“$billIndex”,“$nameIndex”]},{$eq:[“$transactionid”:123]}]}
这就是你的意思吗?别说了,我只是想问一下,
Bills
是唯一的字段,但是
name
不是唯一的字段,假设示例数据库是
[{billid:bnb1234,name:“michael”},{billid:bnb1235,name:“michael”}
Bills=[“bnb1234”,“bnb1235”]
name=[“michael”,“michael”]
现在这里的问题是,当您使用
$match
查看这两个项目的索引时,第一个项目的名称索引将为
1
,票据索引将为
1
,因此这是一个匹配项,但第二个项目的名称索引为
2
,而名称索引为
1
,而非
2
因为名字不是唯一的
)。那么我该如何克服这一点呢。顺便说一句,谢谢你帮我摆脱困境,离解决方案只有一行:)刚刚找到了解决方案:)更改了你的答案,非常感谢。我在帖子中提到了解决方案,在这里更改你的答案,这样我就可以接受它了(y)。假设我有两个嵌套查询,第一个是我的,第二个是你给出的解决方案,如`$match:{$and:{“transactionid”:“12345678”},{Your Query}},现在它可以工作了吗?这是否正确嵌套了?你可以给
$match
添加更多的条件,比如
{$and:[{$ne:[“$billIndex”,-1]},{$ne:[“$nameIndex”,-1]},{$eq:[“$billIndex”,“$nameIndex”]},{$eq:[“$transactionId”:123]}
就是这个意思吗?别管它了,我只是想问一下,
账单
是唯一的字段,但是
名字
不是唯一的,假设示例数据库是
[{billid:bnb1234,名字:“michael”},{billid:bnb1235,name:“michael”}]
Bills=[“bnb1234”,“bnb1235”]
name=[“michael”,“michael”]
现在这里的问题是,当您使用
$match
查看这两个项目的索引时,第一个项目的名称索引将为
1
,票据索引将为
1
,因此这是一个匹配项,但第二个项目的名称索引为
2
,而名称索引为
1
,而非
2
因为名字不是唯一的
)。那么我该如何克服这个问题呢。顺便说一句,谢谢你帮我离开这里,离解决方案只有一行:)刚刚找到了解决方案:)更改了你的答案一点,非常感谢。我在帖子中提到了解决方案,在这里更改你的答案,这样我就可以接受它了(y)。