繁体   English   中英

MongoDB 匹配文档,其中嵌入文档(对象数组)具有(嵌套)数组字段仅出现一次值

[英]MongoDB match document where embeded document (array of objects) has (nested) array field occuring value only once

我的数据库中有以下架构

{
   _id: Number,
   reagents: [ //Array of objects (embedded) FIND IF certain tag in v_class occurred only once in array
       {
           _id: Number,
           v_class: Array, //A single array (string only): ['TEST','PREMIUM']
       },
       {
           _id: Number,
           v_class: Array, //A single array (string only): ['TEST','PREMIUM']
       },
       {
           _id: Number,
           v_class: Array, //A single array (string only): ['TEST','PREMIUM']
       }
   ],
   other_fields: other_values,
}

Mongo游乐场

问题是关于:

如何在v_class数组字段中仅查找包含PREMIUM一词的reagents字段只有一项(试剂、嵌入文档)的文档。

因此,从上面选择的集合中,我只想拥有带有_id: 2的文档,因为它是唯一一个reagents字段具有唯一文档的文档,其中名为v_class单词PREMIUM的字段仅出现一次。

UPD :在$group阶段MongoPlayground (组后)之后,我取得了一些简单的结果。 所以就目前而言,我仍然需要找到v_class数组字段在它的数组中恰好出现一次PREMIUM值的文档`

UPD2:我有新版本出现了。 蒙古游乐场 这个查询很好,但它显示了所有PREMIUM ,除了只发生一次。

$sum需要一个数值才有意义。

获得总和后,额外的$match阶段可以将总和与 1 进行比较。

https://mongoplayground.net/p/TKQowD-vd0f

我已经找到了自己的方法来找到结果,与 Oleg 分开,但他是第一个,所以我支持他并接受他的变体作为答案。

我的查询只有一个区别。 它返回原始文档本身,而不仅仅是参考字段。

完整查询:

db.collection.aggregate([
  {
    $match: {
      reagents: {
        $elemMatch: {
          _id: 12
        }
      }
    }
  },
  {
    $group: {
      _id: {
        v_class: "$reagents.v_class",
        recipe_id: "$_id"
      },
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$_id.v_class"
  },
  {
    $match: {
      "_id.v_class": "PREMIUM"
    }
  },
  {
    $group: {
      _id: "$_id.recipe_id",
      count: {
        $sum: 1,

      },
      data: {
        "$first": "$data"
      }
    }
  },
  {
    $match: {
      count: 1
    }
  }
])

它通过 ID 在试剂 ( Array ) 字段中找到确切的项目,并且它的文档有一个v_class ( Array ) 字段检查它的值/标签是否只出现一次。

Mongo游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM