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

Seb*_*ian 5 mongodb

我有一个将值存储为数组的集合,但这些值必须是字符串。

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}
Run Code Online (Sandbox Code Playgroud)

对于这 800 个我需要 通过 mongo shell转换
"productId" : [ "5dd5ca0170ebec13b8ab1134" ]
成。
"productId" : "5dd5ca0170ebec13b8ab1134"

我已经想到,reduce(聚合)将是可行的方法,但我无法获得正确的语法。

帮助会很棒。多谢

pra*_*ad_ 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 } } ) );
Run Code Online (Sandbox Code Playgroud)



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

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


Joe*_*ole 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 }
>
Run Code Online (Sandbox Code Playgroud)