MongoDB-选择数组包含文档字段的位置

时间:2018-09-21 17:23:27

标签: arrays node.js mongodb

我的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,因为应该允许用户使用具有相同字段的多个配置文件,这将在以后引起复杂性。 预先感谢!

2 个答案:

答案 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'}
})