我有一个包含此架构的条目的集合:
{
"_id" : "5966edbfca08e4e92c6484f0",
"comment" : "....",
"demographics" : [
"596066467e492a9b1944a988"
],
}
我还有一个生成这个数组的表单:
[ { name: 'Age', value: '596066467e492a9b1944a988' },
{ name: 'Gender', value: '595dc5e856207969bd4a2081' } ]
我试图找出一个MongoDB查询,该查询返回集合中的匹配数组,其中"值"在表单数组中,结果位于" demographics"中的数组中。蒙戈入境。如果有多个匹配项,则应与"或"。
匹配答案 0 :(得分: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
,或者通过检查定义为“Schema”的应用程序与mongoose本身一样的数据。在这些情况下,不需要自己“转换”数据,因为它将在发出查询时自动完成。
此处的结果当然是提供的“任意”值与文档中"demographics"
属性的“任意”值匹配的文档。