搜索 MongoDB 对象数组,其中 属性 具有超过 1 个数组元素的相同值
Search MongoDB Array of Objects where property has same value for more than 1 array element
我有一个 Mongo 产品集合,其类别字段是一个对象数组。
{
"_id" : ObjectId("XXX"),
"title" : "Cool Product",
"details" : "Some Details",
"categories" : [
{
"name" : "Cat1",
"isPrimary" : true
},
{
"isPrimary" : true,
"name" : "Cat2"
},
{
"name" : "Cat3"
}
]
}
因为一个产品可以有多个类别,我想强制建立一个主要类别关系(一对一)。但是,在数据迁移中,某些文档对文档中的多个类别设置 isPrimary 属性 true。我需要找到类别数组中多个数组元素的 isPrimary 为真的产品。这是我目前所拥有的:
db.products.find({ "categories" : { "$elemMatch" : { "isPrimary" : { "$exists" : false}}}})
但这只给我结果,其中数组元素之一不存在 isPrimary。我不知道如何查询在多个数组元素上具有相同值的 isPrimary。此外,这也是一个 Spring 查询:
Query query = new Query();
query.addCriteria(new Criteria().orOperator(
Criteria.where("categories").elemMatch(Criteria.where("isPrimary").exists(false)),
Criteria.where("categories").size(0),
Criteria.where("categories")
));
query.with(new Sort(Sort.Direction.ASC, "title"));
return operations.find(query, Product.class);
您需要在此处使用聚合管道:
db.products.aggregate([
{$unwind:"$categories"},
{$match:{"categories.isPrimary":true}},
{$group:{_id:"$_id", numPrimaries:{$sum:1}}},
{$match:{numPrimaries:{$gt:1}}}
])
这将 "unwind" 类别数组,仅保留 isPrimary 为真的类别,"wind" 或按原始 _id 对它们进行分组,求和有多少 isPrimary 值为真,然后过滤掉只有一个的文件。您将留下具有多个类别且 isPrimary 为 true 的文档的 _id 值。
我有一个 Mongo 产品集合,其类别字段是一个对象数组。
{
"_id" : ObjectId("XXX"),
"title" : "Cool Product",
"details" : "Some Details",
"categories" : [
{
"name" : "Cat1",
"isPrimary" : true
},
{
"isPrimary" : true,
"name" : "Cat2"
},
{
"name" : "Cat3"
}
]
}
因为一个产品可以有多个类别,我想强制建立一个主要类别关系(一对一)。但是,在数据迁移中,某些文档对文档中的多个类别设置 isPrimary 属性 true。我需要找到类别数组中多个数组元素的 isPrimary 为真的产品。这是我目前所拥有的:
db.products.find({ "categories" : { "$elemMatch" : { "isPrimary" : { "$exists" : false}}}})
但这只给我结果,其中数组元素之一不存在 isPrimary。我不知道如何查询在多个数组元素上具有相同值的 isPrimary。此外,这也是一个 Spring 查询:
Query query = new Query();
query.addCriteria(new Criteria().orOperator(
Criteria.where("categories").elemMatch(Criteria.where("isPrimary").exists(false)),
Criteria.where("categories").size(0),
Criteria.where("categories")
));
query.with(new Sort(Sort.Direction.ASC, "title"));
return operations.find(query, Product.class);
您需要在此处使用聚合管道:
db.products.aggregate([
{$unwind:"$categories"},
{$match:{"categories.isPrimary":true}},
{$group:{_id:"$_id", numPrimaries:{$sum:1}}},
{$match:{numPrimaries:{$gt:1}}}
])
这将 "unwind" 类别数组,仅保留 isPrimary 为真的类别,"wind" 或按原始 _id 对它们进行分组,求和有多少 isPrimary 值为真,然后过滤掉只有一个的文件。您将留下具有多个类别且 isPrimary 为 true 的文档的 _id 值。