Javascript Mongoose查询在多个数组中查找匹配元素
我有这样的数据:Javascript Mongoose查询在多个数组中查找匹配元素,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有这样的数据: { name:'string' A: [ { D: [] } ], B:[ { D:[] } ], C:[ { D:[] } ] } 我想在A、B和C的每个数组中的所有D数组中搜索匹配项 我做了这个查询,但它总是返回一个空数组,所以我认为我做得不对 model.find({'name':nameVar, $elemMatch:[ {'A':{'A.D':{$
{
name:'string'
A: [
{
D: []
}
],
B:[
{
D:[]
}
],
C:[
{
D:[]
}
]
}
我想在A
、B
和C
的每个数组中的所有D
数组中搜索匹配项
我做了这个查询,但它总是返回一个空数组,所以我认为我做得不对
model.find({'name':nameVar, $elemMatch:[
{'A':{'A.D':{$in:[matchVar]}}},
{'B':{'B.D':{$in:[matchVar]}}},
{'C':{'C.D':{$in:[matchVar]}}}]},function(err,data){...
如何返回A
、B
和C
中matchVar
位于D
内的所有元素
编辑: 看起来这根本不可能?
但我仍然在等待答案如果我理解你在问题中的实际问题,那么根据这些数据:
{
"name" : "string",
"A" : [ { "D" : [ "B" ] } ],
"B" : [ { "D" : [ "A" ] } ],
"C" : [ { "D" : [ "B" ] } ]
},
{
"name" : "string",
"A" : [ { "D" : [ "C" ] } ],
"B" : [ { "D" : [ "C" ] } ],
"C" : [ { "D" : [ "C" ] } ]
},
{
"name" : "string",
"A" : [ { "D" : [ "C" ] } ],
"B" : [ { "D" : [ "B" ] } ],
"C" : [ { "D" : [ "C" ] } ]
}
第一个文档如下所示:
db.collection.find({
"$or": [
{ "A.D": "A" },
{ "B.D": "A" },
{ "C.D": "A" },
]
})
或者,您的意思是相反的,因此仅匹配第二个文档:
db.collection.find({
"$and": [
{ "A.D": "C" },
{ "B.D": "C" },
{ "C.D": "C" },
]
})
您引用的链接实际上指的是操作员的一些不同行为,该行为在2.6版本中已被更改,以执行它真正应该执行的操作。但这并不适用于这个问题,你是如何提出的
因此,如果您想要匹配任何数组,则在每个查询语句周围使用。另一方面,如果您只想匹配所有数组中包含您的匹配项的位置,请使用运算符
这是合乎逻辑的;)
编辑 请记住,
.find()
是关于匹配文档的。如果您确实希望在数组中匹配超出一个匹配范围的元素,则可以使用聚合来过滤内容:
db.collection.aggregate([
// Matching documents still makes sense to reduce the pipeline
{ "$match": {
"$or": [
{ "A.D": "B" },
{ "B.D": "B" },
{ "C.D": "B" },
]
}},
// Unwind all of the arrays
{ "$unwind": "$A" },
{ "$unwind": "$B" },
{ "$unwind": "$C" },
{ "$unwind": "$A.D" },
{ "$unwind": "$B.D" },
{ "$unwind": "$C.D" },
// Set up for the next stage by adding "type"
{ "$project": {
"A": 1,
"B": 1,
"C": 1,
"type": { "$cond": [1, ["A","B","C"], 0] }
}},
// Unwind that array so every document copied for each type
{ "$unwind": "$type" },
// Do some conditional re-shaping to key/values
{ "$project": {
"key": { "$cond": [
{ "$eq": [ "$type", "A" ] },
"A",
{ "$cond": [
{ "$eq": [ "$type", "B" ] },
"B",
{ "$cond": [
{ "$eq": [ "$type", "C" ] },
"C",
false
]}
]}
]},
"value": { "$cond": [
{ "$eq": [ "$type", "A" ] },
"$A",
{ "$cond": [
{ "$eq": [ "$type", "B" ] },
"$B",
{ "$cond": [
{ "$eq": [ "$type", "C" ] },
"$C",
false
]}
]}
]}
}},
// Filter for only the matching documents
{ "$match": { "value.D": "B" } },
// Just group that by id
{ "$group": {
"_id": "$_id",
"doc": { "$push": {
"key": "$key",
"value": "$value"
}}
}}
])
这将返回结果:
{
"_id" : ObjectId("53473e6ecb495e216c98292b"),
"doc" : [
{
"key" : "B",
"value" : {
"D" : "B"
}
}
]
}
{
"_id" : ObjectId("53473d87cb495e216c982929"),
"doc" : [
{
"key" : "A",
"value" : {
"D" : "B"
}
},
{
"key" : "C",
"value" : {
"D" : "B"
}
}
]
}
因此,我得到了两个文档,其中只有符合条件的数组中的行。虽然格式与之前不同,但最终结果是一样的
你可以使用2.6中的一些附加功能(我想,我还没有尝试过)将形状重新调整回原来的形状,但一般来说,结果是可能的。这需要大量的工作,但正如您从重新成形的表单中所看到的,如果您想这样查询,它还指示了数据“应该”的格式。不,对不起,这与我的数据不同。@Houseman这是什么意思?如果您没有准确地说明您的意思,您希望如何得到您想要的答案?这意味着我的数据的排列方式与示例数据的排列方式不同,因此,您的解决方案不适合我的问题。我在问题中举例说明了我的数据是如何排列的。@Houseman如果你想要一个真实的答案,请展示你的真实数据。我实际上怀疑答案基本上是一样的,你只需要用不同的方法来应用它。我实际上不想在某些东西匹配的地方找到完整的文档。正如我所说,我想找到“所有
A
、B
和C
中matchVar
在D
中的元素”,而不是这些元素为真的文档。