我的collection("users")
中的文档如下:
{
_id: ObjectID(...),
verifiedFields:
{
email: ["user@example.com", "othermail@example.com"],
phone: [...]
},
profiles:
[
{
_id: ObjectID(...),
fields:
{
email: { value: "user@example.com" }
}
}
]
}
我现在要选择profiles.field.email.value
中包含verifiedFields.email
的所有用户。我希望避免存储布尔值verified
,因为应该允许用户使用具有相同字段的多个配置文件,这将在以后引起复杂性。
预先感谢!
答案 0 :(得分:1)
您的查询是:
db.users.find({
$expr: {$gt: [{$size: {$setIntersection: ['$profiles.fields.email.value', '$verifiedFields.email']}}, 0]}
})
此查询不使用索引,因此在性能问题上,您需要添加verified
字段。
请检查aggregation pipeline和$expr
,以更好地理解此查询。用于测试查询的管道为:
db.test.aggregate([
{ $addFields: {a : '$profiles.fields.email.value'}},
{ $addFields: {b: { $setIntersection: ['$a', '$verifiedFields.email']}}},
{ $match: {$expr: {$gt: [{$size: '$b'}, 0]}}}
])
答案 1 :(得分:0)
类似的东西应该可以工作:
collection('users').find({
'profiles[0].fields.email.value': {$in: 'verifiedFields.email'}
})