Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose查询在多个数组中查找匹配元素_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

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
中的元素”,而不是这些元素为真的文档。