Arrays MongoDB是否使用两个输入数组值执行$match?
在MongoDB中,我试图编写一个查询,其中有两个输入数组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
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)。