【问题标题】:Mongodb check of there is any result of array A contains but array B do notMongodb检查数组A是否包含但数组B不包含任何结果
【发布时间】:2017-05-23 15:05:03
【问题描述】:

这是我的数据结构 我想得到一个结果,我可以得到在版主中有一行但在成员中没有的文档

{
  "_id" : "10",
  "members" : [ 
    "10",
    "20",
    "30"
  ],
  "moderators" : [ 
    "50",
    "60",
    "70"
  ]
}

【问题讨论】:

  • 你可以在这里粘贴一个示例文档吗?
  • { "_id" : "10", "members" : [ "10", "20", "30" ], "moderators" : [ "50", "60", "70 " ] }
  • 你的意思是如果50是版主而不是会员?或主持人是非零大小的数组,成员是一个空数组?
  • 你可以使用setDifference
  • 我的意思是退回文件,因为版主有 50 人,但成员却没有

标签: arrays mongodb database


【解决方案1】:

您可以使用$setDifference 执行相对补码以获取moderator 数组中不在members 数组中的行,然后使用$match 来获取填充foundInModerator 的所有条目。

db.collection.aggregate(
   [
     { $project: { members: 1, moderators: 1, foundInModerator: { $setDifference: [ "$moderators", "$members" ] }, _id: 0 } },
     { $match:{foundInModerator:{$ne:[] } } }
   ]
) 

【讨论】:

  • 还有如何添加moderator数组不为空的条件?
  • 您可以通过多种方式来实现。在管道顶部使用$match 阶段,主持人数组的条件不为空,或者您可以更新foundInModerator 表达式以使用$cond 运算符,主持人数组的条件不为空; if false return [] array 或 else true return 与setDifference比较
【解决方案2】:

要返回值在“一个数组”中但“不在另一个”中的结果,只需使用$ne 操作:

db.collection.find({ "moderators": "50", "members": { "$ne": "50" } })

因此,匹配条件仅在"50" 存在于"moderators" 数组中但 存在于"members" 数组中时返回正数。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2019-08-10
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2012-09-14
    • 2011-04-23
    相关资源
    最近更新 更多