首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB:如何将文档中的多个字段输出到数组中(作为一个新字段)?

MongoDB:如何将文档中的多个字段输出到数组中(作为一个新字段)?
EN

Stack Overflow用户
提问于 2021-09-25 20:23:08
回答 2查看 582关注 0票数 0

MongoDB: 4.4.9,Mongosh: 1.0.4

我有一个MongoDB集合,其中包含了每个月的生产数据作为单独的字段(monthlyProd1、monthlyProd2等)。每个字段都是一个月的生产数据,值是一个对象数据类型。

文件示例:

代码语言:javascript
运行
复制
_id: ObjectId("314e0e088f183fb7e699d635")
name: "documentName"
monthlyProd1: Object
monthlyProd2: Object
monthlyProd3: Object
...

我想花上所有的时间,把它们放到一个新的字段(monthlyProd)中--一个对象数组。

--我似乎无法用我尝试过的不同方法访问字段。例如,这接近于做我想做的事情:

代码语言:javascript
运行
复制
db.monthlyProdData.updateMany({}, 
    { $push: { "monthlyProd": { $each: [ "$monthlyProd1", "$monthlyProd2", "$monthlyProd3" ] } } }
) 

...but没有像我所希望的那样从每个字段获取值/对象数据,而是将一个字符串输出到monthlyProd数组("$monthlyProd1“、"$monthlyProd2”、.):

实际产出:

代码语言:javascript
运行
复制
monthlyProd: Array
    0:  "$monthlyProd1"
    1:  "$monthlyProd2"
    2:  "$monthlyProd3"
    ...

期望产出:

代码语言:javascript
运行
复制
monthlyProd: Array
    0:  Object
    1:  Object
    2:  Object
    ...

我要的是数据,不是字符串!LOL。谢谢你的帮助!

注:某些月份/字段可能是空字符串(""),因为没有生产。我希望确保不向数组中添加空字符串--只有几个月的生产/字段具有对象数据类型。尽管如此,如果我能够访问这些字段的数据,我可以尝试自己解决这个问题!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-25 21:16:59

试试这个:

代码语言:javascript
运行
复制
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" } }
])

蒙戈游乐场

票数 1
EN

Stack Overflow用户

发布于 2021-09-27 03:47:23

谢谢您为这个问题提供了最初的解决方案。我修改了解决方案,将我的"Note"合并为忽略任何空的monthlyProd#值(也就是没有任何产品的月份),这样就不会将它们添加到最终的monthlyProd数组中。

为此,我将一个$and运算符添加到$filter中的cond:中,并添加了以下表达式作为$and运算符的第二个表达式(如果它们是字符串或对象数据类型,则使用""{}来处理空字段值):

代码语言:javascript
运行
复制
{ $not: { $in: [ "$$this.v", [ "", {} ] ] } }

最终解决方案:

代码语言:javascript
运行
复制
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 } }
])

再次感谢@社区!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69329734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档