[英]Mongodb copy field to another collection
假设我有收集orders
{
"id":"1",
"items":{
"itemId":"1000",
"name":"Item 1",
"status":"STATUS"
}
}
{
"id":"2",
"items":{
"itemId":"1000",
"name":"Item 1",
"status":"ANOTHER_STATUS"
}
}
我也有收集item_projections
这是
{
"id":"1",
"itemId":"1000",
"name":"Item 1",
"orderId":"1"
}
{
"id":"1",
"itemId":"1000",
"name":"Item 1",
"orderId":"2"
}
对于收集orders
中的每个项目,我想将字段status
复制到投影以匹配订单id
和itemId
{
"id":"1",
"itemId":"1000",
"name":"Item 1",
"orderId":"1",
"status":"STATUS"
}
{
"id":"1",
"itemId":"1000",
"name":"Item 1",
"orderId":"2",
"status":"ANOTHER_STATUS"
}
是否可以通过聚合查找和合并管道来做到这一点?
解决方案 1
$lookup
- item_projections
集合(键: orderId
)加入orders
集合(键: id
)并返回orders
数组字段和status
字段的文档。
$replaceRoot
- 用新文档替换输入文档。
2.1。 $mergeObjects
- 将根文档与orders
的第一个文档合并。
$unset
- 删除orders
字段。
db.item_projections.aggregate([
{
"$lookup": {
"from": "orders",
"localField": "orderId",
"foreignField": "id",
"pipeline": [
{
$project: {
status: "$items.status"
}
}
],
"as": "orders"
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
"$$ROOT",
{
$first: "$orders"
}
]
}
}
},
{
$unset: "orders"
}
])
解决方案 2
或者您可以用$project
替换第二和第三阶段。
{
$project: {
"id": 1,
"itemId": 1,
"name": 1,
"orderId": 1,
"status": {
$first: "$orders.status"
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.