MongoDB shell: 如何将数组字段转换为字符串

5
我有一个存储值的集合,其中这些值是数组形式的,但需要将它们转换为字符串。

在4000个数据集中,有800个数据集需要进行转换。

{'_id': '5c4f8408fc69ca02c92ac822',
 'enabled': true,
 'order_date': '2019-01-29T10:36:56.906Z',
 'order_id': 'PO-ERSNJ9',
 'productId': ['5dd5ca0170ebec13b8ab1134'],
 'selling_date': null,
 'selling_price': 99.99,
 'split_invoice': null}

我需要将这800个内容进行转换:
"productId" : [ "5dd5ca0170ebec13b8ab1134" ]
转换为
"productId" : "5dd5ca0170ebec13b8ab1134"
需要使用mongo shell实现。

我已经猜到可以使用reduce(聚合)来实现,但是我无法准确使用语法。

希望能得到帮助。非常感谢。


这里有一个类似的问题,其中包含一些答案:将字符串数组转换为字符串 - prasad_
2个回答

7

这个 shell 查询会更新集合中 "orderId" 数组字段的字符串值。

db.orders.aggregate( [
  { 
     $match: { productId: { $type: "array" } } 
  },
  { 
     $addFields: { productId: { $arrayElemAt: [ "$productId", 0 ] } } 
  }
] 
).forEach( doc => db.orders.updateOne( { _id: doc._id }, { $set: { productId: doc.productId } } ) );



此更新将把数组值转换为字符串 - 仅适用于MongoDB 4.2或更高版本。请注意,此更新在update方法中使用聚合管道

db.orders.updateMany( 
  { 
      productId: { $type: "array" } 
  },
  [
      { 
          $set: { productId: { $arrayElemAt: [ "$productId", 0 ] } } 
      },
  ]
)

1
MongoDB v4.4引入了$first数组聚合操作符。在上述的updateMany中,可以使用productId: { $first: "$productId" }代替productId: { $arrayElemAt: [ "$productId", 0 ] } - prasad_

1

您想要的功能可以使用mongodb $unwind 操作符实现。在下面的MongoDB shell示例中可以看到一个例子。

> use test
switched to db test
> db.stack.insertOne({ "_id" : "5c4f8408fc69ca02c92ac822", "enabled" : true, "productId" : [ "5dd5ca0170ebec13b8ab1134" ], "selling_price" : 99.99, "order_date" : "2019-01-29T10:36:56.906Z", "order_id" : "PO-ERSNJ9", "selling_date" : null, "split_invoice" : null })
{ "acknowledged" : true, "insertedId" : "5c4f8408fc69ca02c92ac822" }
> db.stack.aggregate( [{"$unwind" : "$productId"}])
{ "_id" : "5c4f8408fc69ca02c92ac822", "enabled" : true, "productId" : "5dd5ca0170ebec13b8ab1134", "selling_price" : 99.99, "order_date" : "2019-01-29T10:36:56.906Z", "order_id" : "PO-ERSNJ9", "selling_date" : null, "split_invoice" : null }
>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接