MongoDB: 4.4.9,Mongosh: 1.0.4
我有一个MongoDB集合,其中包含了每个月的生产数据作为单独的字段(monthlyProd1、monthlyProd2等)。每个字段都是一个月的生产数据,值是一个对象数据类型。
文件示例:
_id: ObjectId("314e0e088f183fb7e699d635")
name: "documentName"
monthlyProd1: Object
monthlyProd2: Object
monthlyProd3: Object
...我想花上所有的时间,把它们放到一个新的字段(monthlyProd)中--一个对象数组。
--我似乎无法用我尝试过的不同方法访问字段。例如,这接近于做我想做的事情:
db.monthlyProdData.updateMany({},
{ $push: { "monthlyProd": { $each: [ "$monthlyProd1", "$monthlyProd2", "$monthlyProd3" ] } } }
) ...but没有像我所希望的那样从每个字段获取值/对象数据,而是将一个字符串输出到monthlyProd数组("$monthlyProd1“、"$monthlyProd2”、.):
实际产出:
monthlyProd: Array
0: "$monthlyProd1"
1: "$monthlyProd2"
2: "$monthlyProd3"
...期望产出:
monthlyProd: Array
0: Object
1: Object
2: Object
...我要的是数据,不是字符串!LOL。谢谢你的帮助!
注:某些月份/字段可能是空字符串(""),因为没有生产。我希望确保不向数组中添加空字符串--只有几个月的生产/字段具有对象数据类型。尽管如此,如果我能够访问这些字段的数据,我可以尝试自己解决这个问题!
发布于 2021-09-25 21:16:59
试试这个:
db.collection.updateMany({}, [
// convert to k-v Array
{ $set: { monthlyProd: { $objectToArray: "$$ROOT" } } },
{
$set: {
monthlyProd: {
// removed not needed objects
$filter: {
input: "$monthlyProd",
cond: { $not: { $in: [ "$$this.k", [ "name", "_id" ] ] } }
// or cond: { $in: [ "$$this.k", [ "monthlyProd1", "monthlyProd2", "monthlyProd3" ] ] }
}
}
}
},
// output array value
{ $project: { monthlyProd: "$monthlyProd.v" } }
])发布于 2021-09-27 03:47:23
谢谢您为这个问题提供了最初的解决方案。我修改了解决方案,将我的"Note"合并为忽略任何空的monthlyProd#值(也就是没有任何产品的月份),这样就不会将它们添加到最终的monthlyProd数组中。
为此,我将一个$and运算符添加到$filter中的cond:中,并添加了以下表达式作为$and运算符的第二个表达式(如果它们是字符串或对象数据类型,则使用""和{}来处理空字段值):
{ $not: { $in: [ "$$this.v", [ "", {} ] ] } }最终解决方案:
db.monthlyProdData2.updateMany({}, [
// convert to k-v Array
{ $set: { monthlyProd: { $objectToArray: "$$ROOT" } } },
{
$set: {
monthlyProd: {
// removed not needed objects
$filter: {
input: "$monthlyProd",
cond: { $and: [
{ $not: { $in: [ "$$this.k", [ "name", "_id" ] ] } },
{ $not: { $in: [ "$$this.v", [ "", {} ] ] } }
]}
}
}
}
},
// output array value
{ $project: { monthlyProd: "$monthlyProd.v", name: 1 } }
])再次感谢@社区!
https://stackoverflow.com/questions/69329734
复制相似问题