我有一个将值存储为数组的集合,但这些值必须是字符串。
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(聚合)将是可行的方法,但我无法获得正确的语法。
帮助会很棒。多谢
此 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)
update。
db.orders.updateMany(
{
productId: { $type: "array" }
},
[
{
$set: { productId: { $arrayElemAt: [ "$productId", 0 ] } }
},
]
)
Run Code Online (Sandbox Code Playgroud)
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)