[英]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,
}
问题是关于:
如何在
v_class
数组字段中仅查找包含PREMIUM
一词的reagents
字段只有一项(试剂、嵌入文档)的文档。
因此,从上面选择的集合中,我只想拥有带有_id: 2
的文档,因为它是唯一一个reagents
字段具有唯一文档的文档,其中名为v_class
单词PREMIUM
的字段仅出现一次。
UPD :在$group
阶段MongoPlayground (组后)之后,我取得了一些简单的结果。 所以就目前而言,我仍然需要找到v_class
数组字段在它的数组中恰好出现一次PREMIUM
值的文档`
UPD2:我有新版本出现了。 蒙古游乐场。 这个查询很好,但它显示了所有PREMIUM
,除了只发生一次。
我已经找到了自己的方法来找到结果,与 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
) 字段检查它的值/标签是否只出现一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.