2017-07-14 67 views
0

我有了这个架构项的集合:查询到匹配数组输入

{ 
    "_id" : "5966edbfca08e4e92c6484f0", 
    "comment" : "....", 
    "demographics" : [ 
     "596066467e492a9b1944a988" 
    ], 
} 

我也有产生这种阵列形式:

[ { name: 'Age', value: '596066467e492a9b1944a988' }, 
{ name: 'Gender', value: '595dc5e856207969bd4a2081' } ] 

我想图取出一个MongoDB查询,该查询返回集合中的匹配数组,其中表单数组结果中的“值”位于“demographics”mongo条目中的数组中。如果有多个匹配,它应该匹配一个“或”。

回答

1

由于您的"demographics"字段纯粹是“ObjectId数组”或至少类似构造的数据,因此您真正需要做的唯一事情就是将您的输入强制为简单的值和匹配数组。

$in运算符基本上是应用于单个字段的$or的简写形式。所以它需要和值的数组,因为它的参数被认为是匹配指定的字段。此外,MongoDB在查询表单中的“数组”或“单数属性”之间没有区别。

但基本转化为简单的值,只需要简单的.map()

var input = [ 
    { name: 'Age', value: '596066467e492a9b1944a988' }, 
    { name: 'Gender', value: '595dc5e856207969bd4a2081' } 
]; 

var query = { 
    "demographics": { 
    "$in": input.map(i => ObjectId(i.value)) 
    } 
}; 

collection.find(query) 

使用假设,当然,你的实际数据为ObjectId格式,而不是“字符串”的,但是从任何实际的“表单输入” HTTP请求将始终以“字符串”的形式呈现,并且需要将其转换为正确的类型才能匹配类型不同的位置。

一些库如mongoose实际上将“投”的值你,无论是由“推定”,一个提供的值实际上是一个ObjectId或通过检查定义的“模式”的数据的应用,就是这种情况与猫鼬本身。在这些情况下,您无需自己“投射”数据,因为发出查询时会自动完成。

这里的结果当然是文档中提供的任意值与文档中"demographics"属性的“任意”值匹配的文档。

+0

太棒了,谢谢! – NickL