当前位置: 首页 > 知识库问答 >
问题:

如何比较MongoDB中同一对象的数组元素?

谭奕
2023-03-14

我有一个包含以下数据的文档集合

[{
_id:ObjectId(),
status:"created",
users:[{
email:"xyz@gmail.com",
role:"admin"
},
{
email:"abc@gmail.com",
role:"admin"
},
{
email:"abc@gmail.com",
role:"user"
}]
},
{
_id:ObjectId(),
status:"created",
users:[{
email:"pqr@gmail.com",
role:"admin"
},
{
email:"abc@gmail.com",
role:"admin"
},
{
email:"pqr@gmail.com",
role:"user"
}]
}]

我想获取具有“管理员”和“用户”角色且状态为“已创建”的用户的文档计数。现在,我正在尝试匹配电子邮件ID和角色。

db.documents.aggregate([
       {"$match":{
           "status":"created",
    "$expr":{
      "$eq":[
        {"$size":{"$setIntersection":["$users.email_id","$users.email_id"]}},
        0
      ]
    }
  }},
    ])

有什么方法可以比较来自同一对象的数组元素吗?

共有1个答案

锺离玮
2023-03-14

我想获取具有“管理员”和“用户”角色且状态为“已创建”的用户的文档计数。现在,我正在尝试匹配电子邮件ID和角色。

可以使用聚合或查找查询,如下所示:

var MATCH_EMAIL = "abc@gmail.com"

db.collection.aggregate( [
  { 
      $match: { 
          $and: [ { status: "created" } , { "users": { $elemMatch: { role: "admin", email: MATCH_EMAIL } } } ],
          "users": { $elemMatch: { role: "user", email: MATCH_EMAIL } } 
      } 
  },
  { 
      $count: "Count" 
  }
] )

// -- or --

db.collection.find( { 
    $and: [ { status: "created" } , { "users": { $elemMatch: { role: "admin", email: MATCH_EMAIL } } } ],
    "users": { $elemMatch: { role: "user", email: MATCH_EMAIL } } 
} ).count()

请注意,两种情况下的查询过滤器是相同的。聚合返回类似< code>{ "Count" : 1 }的结果文档,但是查找查询只返回计数值,类似< code>1。< br >

[编辑添加]

更新了代码,使“用户”和“管理员”的电子邮件相同。

db.collection.aggregate( [
  { 
      $match: { 
          $and: [ { status: "created" } , { "users.role": "admin" } ],
          "users.role": "user"
      } 
  },
  { 
      $unwind: "$users" 
  },
  { 
      $group: { 
          _id: { _id: "$_id", email: "$users.email" },
          roles: { $push: "$users.role" }
      } 
  },
  { 
      $match: { 
          $expr: { $gt: [ { $size: "$roles" }, 1 ] } 
      } 
  },
  { 
      $count: "Count with user+admin roles and same email" 
  }
] )
 类似资料:
  • 假设我有一个叫“序列”的类。这个类有一个实例变量。还有一些方法可以创建这个选项卡,比如: 现在,我想创建一个方法,它接受两个Sequence对象作为参数,并返回相同tab元素的数量。所以,我创建了这样的方法:

  • 问题内容: 我想比较JavaScript代码中2个对象数组。这些对象共有8个属性,但是每个对象都不会有一个值,并且每个数组的大小永远都不能超过8个,因此可能要使用遍历每个对象然后查看对象的值的蛮力方法。 8个属性是执行我想做的最简单的方法,但是在实现之前,我想看看是否有人有一个更优雅的解决方案。有什么想法吗? 问题答案: 编辑:您不能在JavaScript解释器的当前基于浏览器的常见实现中重载运算

  • 如果两个集合包含相同的对象,如何进行比较? 当然会打印错误。

  • 问题内容: 我有两个像这样的对象数组: 我想知道数组是否相等。我定义的是相等的,因为array1中的每个值都与array2中该位置的值相同。因此,这两个数组将相等。 为什么最好找出这两个数组是否相等? 不是一个很深的等式,所以它是行不通的,我不知道是否遍历每个元素并进行比较是解决此问题的最佳,最有效的方法。有没有人有更好的建议? 编辑:我需要一个可以放入嵌套数组的等于。 问题答案: 使用。这项功能

  • 我正在MongoDB中寻找合适的查询来比较关联数组中的两个值,我有这样的文档: 我需要比较 futurePrice 和 price 字段,以查找至少具有一种格式和 futurePrice 的文档 我尝试了这样的东西: 但是好像不行,有办法吗?