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

根据数组中的条件从数组中获取非重复值

盖锐
2023-03-14

我收藏了这样的文件:

{
"_id" : ObjectId("59df91dae4b03289d79efb4e"),
  "name" : "TEST",
  "payload" : [ 
    {
      "_id" : "ABC",
      "status": "FALSE"
    },
    {
      "_id":"DEF",
     "status": "TRUE"
    },
    {
      "_id" : "XYZ",
     "status": "NULL"
    }
  ]
}

我想找到所有的有效载荷。_id,其状态为真/假。预期结果是

["ABC","DEF"]

到目前为止,我有这样的东西。

db.collection.distinct('payload._id',{"_id" : "TEST"})

不确定如何为数组中的元素添加条件。

共有2个答案

徐友樵
2023-03-14

我正在寻找所有有效载荷。_id状态为真/假

要运行的查询是:

db.collection.distinct('payload._id', { 
  'payload.status': { $in: ["TRUE", "FALSE"] } 
})

更详细的方法是:

db.collection.distinct('payload._id', { 
  $or: [
    {'payload.status': "TRUE" },
    {'payload.status': "FALSE" }
  ]  
})
荣波
2023-03-14

用<代码>查询条件。distinct()应用于“文档选择”,而不是文档“内部”包含的数组条目。如果您需要“过滤”数组内容,那么您可以应用< code >。aggregate()以及一些后处理,以便只获得数组响应中的“值”。

db.collection.aggregate([
  { "$match": { "_id": "TEST" } },
  { "$unwind": "$payload" },
  { "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
  { "$group": { "_id": "$payload._id" } },
]).map( d => d._id );

这里的主要部分是$unload管道阶段,您之所以这样做,主要是因为您希望数组中的值稍后用作$groupon的键。这基本上为每个数组成员生成一个新文档,但每个文档只包含该数组成员。这是对包含数组的MongoDB结构的“非规范化”。

接下来是下面的< code>$match管道,它像任何查询一样工作,只选择匹配条件的文档。因为所有数组成员现在都是“文档”,所以不匹配的条目(作为文档)将被排除。您也可以使用< code>$filter来提取一个数组,但是由于我们需要< code>$unwind用于下一阶段,我们也可以简单地使用< code>$match。

此时,您只剩下与条件匹配的数组条目。$group是获取“不同”值,因此通常您会在更广泛的选择上执行此操作,而不仅仅是单个文档或此处的值尚未不同的任何内容。所以这实际上只是保持 .distinct() 的所有相同行为不变。

最后,由于 .aggregate() 的输出与 .distinct() 的设计不同,因为它在结果中返回“文档”,我们只需使用 .map() 方法处理游标结果,并仅返回特定文档属性中的“值”作为“数组”。

 类似资料:
  • 我有以下数组 我想从这个数组中得到唯一的值。所以我希望我的结果是这样的 我使用了数组唯一函数,但无法得到结果 如果我有两个索引,这是有效的,但是对于多个索引呢?

  • 问题内容: 我有以下数组: 结果: 现在如何显示具有重复值的键?在此函数不应返回([0],[9]),因为没有重复的值。 如何找到相同值的键,例如 对于“ 2011-06-25”,应返回[7],[8] 问题答案: 函数名称显然很长;) 现在$ dups将包含一个由重复值键控的多维数组,其中包含每个重复项的键,如果您将“ true”作为第二个参数发送,它将返回没有重复值的原始数组。 或者,您可以将原始

  • 如果条件匹配,我想从多数组中获取变量的特定值。 打印阵列时: 给出如下数组: 如果ID与21匹配,我正在尝试获取客户号码

  • 如果我有一个数组如下所示: 如何按cuisinetype对此进行排序? 提前感谢您的帮助!我尝试过其他建议,但没有太大的成功!

  • 我有这个初始数组,希望根据和提取重复航班 我写了这个,但我只能得到第一个重复的,看起来不是很漂亮。 有什么建议吗?

  • 我想对两列使用不同的条件来聚合行。 当我做,我得到输出1 当我做时,我得到输出2 是否有一种方法可以进行聚合,将输出1显示到,将输出2显示到?