MongoDB DB:如何从子集合嵌入文档到父MongoDB版本是4.2?



2MongoDB收藏:

Categories:

{
"_id" : ObjectId("6044ad2973d61b6452d46391"),
"name" : "Category 1"
}

Products:

/* 1 */
{
"_id" : ObjectId("6044ad6673d61b6452d463bd"),
"name" : "Product 1",
"categoryId" : "6044ad2973d61b6452d46391"
}
/* 2 */
{
"_id" : ObjectId("6044ad8173d61b6452d463c6"),
"name" : "Product 2",
"categoryId" : "6044ad2973d61b6452d46391"
}

在本地PC上,我已经安装了最新版本的MongoDB(>4.4),这就是为什么要将文档从Products集合嵌入到Categories,我需要编写一个相当琐碎和简单的脚本:

db.getCollection('categories').aggregate([
{$match: {}}, 
{$addFields:{
idStr: {$toString: "$_id"}
}},

{
$lookup: {
from: "products",
localField: "idStr",
foreignField: "categoryId",
as: "products"
}
},

{$project:{
idStr: 0}},

{$merge:
{
into: "categories",
on:"_id" 
}}
])

由于$merge阶段的以下限制,当我使用MongoDB版本4.2时出现问题:

4.4之前版本的MongoDB不允许$merge输出到与聚合的集合相同。

所以,问题是:如何重写现有的查询有可能执行版本4.2?

$out:获取聚合管道返回的文档,并将它们写入指定的集合。$out操作符必须是管道中的最后一级。

试试这个:

db.categories.aggregate([
{ $match: {} },
{
$addFields: {
idStr: { $toString: "$_id" }
}
},
{
$lookup: {
from: "products",
localField: "idStr",
foreignField: "categoryId",
as: "products"
}
},
{
$project: { idStr: 0 }
},
{
$out: "categories"
}
]);

注意:注意$match阶段,因为您将丢失所有不符合条件的文档。

相关内容

  • 没有找到相关文章

最新更新