
[英]How to push a new element into an array inside a mongo doc using `update`?
[英]How to group mongo doc based on key inside an array?
我有一个包含这些文件的集合:
{
sku: 1,
values: [{x: false, z: 100}]
}
{
sku: 1,
values: [{z: 100}]
}
{
sku: 2
values: [{x: false, z: 100}]
}
请注意,带有
sku
2
的文档没有重复,但它在数组内的对象中具有键x
。
如何查询按sku
分组的文档并获得没有x
键但同时也获得不重复但具有x
键的sku
的文档?
我期望的结果是:
{
sku: 1,
values: [{z: 100}]
}
{
sku: 2,
values: [{x: false, x: 100}]
}
我想忽略一个文档,如果它被密钥sku
复制并且有密钥x: false
但如果该文档没有被sku
复制以获取它
因此,重新表述您的要求:如果有多个具有特定sku
文档,您希望使用x: false
过滤掉所有值
您需要聚合框架的$group来获取单个sku
所有数据。 然后您可以使用$concatArrays运行$ reduce以压平values
数组和$filter作为应用您的业务规则的最后一步:
db.collection.aggregate([
{
$group: {
_id: "$sku",
count: { $sum: 1 },
values: { $push: "$values" }
}
},
{
$addFields: {
values: {
$reduce: {
input: "$values",
initialValue: [],
in: { $concatArrays: [ "$$value", "$$this" ] }
}
}
}
},
{
$project: {
_id: 0,
sku: "$_id",
values: {
$filter: {
input: "$values",
cond: {
$or: [
{ $eq: [ "$count", 1 ] },
{ $ne: [ "$$this.x", false ] }
]
}
}
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.