Mongoose查询来查找多个数组中的匹配元素

我有这样的数据:

{ name:'string' A: [ { D: [] } ], B:[ { D:[] } ], C:[ { D:[] } ] } 

我想通过ABC每个数组中的所有D数组search一个匹配。

我做了这个查询,但总是返回一个空的数组,所以我不认为我做对了。

 model.find({'name':nameVar, $elemMatch:[ {'A':{'A.D':{$in:[matchVar]}}}, {'B':{'B.D':{$in:[matchVar]}}}, {'C':{'C.D':{$in:[matchVar]}}}]},function(err,data){... 

如何返回ABCmatchVarD内的所有元素?


编辑:

看起来这是不可能的? https://groups.google.com/forum/#!topic/mongodb-user/rUHK43Xtp88

但我仍然坚持要一个答案

那么如果我明白你的问题实际上是在问什么,那么用这个数据:

 { "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" ] } ] } 

你find第一个文件是这样的:

 db.collection.find({ "$or": [ { "AD": "A" }, { "BD": "A" }, { "CD": "A" }, ] }) 

或者,也许你的意思是相反,所以只匹配第二个文档:

 db.collection.find({ "$and": [ { "AD": "C" }, { "BD": "C" }, { "CD": "C" }, ] }) 

你引用的链接实际上是指在2.6版本中已经改变的$all操作符的一些不同的行为,以实现它应该做的事情。 但是,这个问题并不适用于你提出的问题。

所以,如果你想要任何数组匹配,然后使用$or每个查询语句。 另一方面,如果只想匹配所有数组包含匹配的地方,则使用$and运算符。

这只是合乎逻辑的;)


编辑

请记住.find()是关于匹配的文档。 如果实际上想要匹配超出一个匹配的数组内的元素,则只能使用聚合来过滤内容:

 db.collection.aggregate([ // Matching documents still makes sense to reduce the pipeline { "$match": { "$or": [ { "AD": "B" }, { "BD": "B" }, { "CD": "B" }, ] }}, // Unwind all of the arrays { "$unwind": "$A" }, { "$unwind": "$B" }, { "$unwind": "$C" }, { "$unwind": "$AD" }, { "$unwind": "$BD" }, { "$unwind": "$CD" }, // 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" } } ] } 

所以我得到了两个文件,只有数组中匹配条件的行。 不像它进入的格式,但最终的结果是一样的。

你可以使用一些额外的function,可以使用2.6(我想我还没有尝试过)重新塑造形状,但一般来说,然后是的,结果是可能的。 这是很多的工作,但是从重新塑造的forms中可以看出,如果你想这样查询的话,它也给出了数据“应该”可能在的格式的指示。