gpt4 book ai didi

mongodb - 使用他们的文档聚合填充 id 数组

转载 作者:行者123 更新时间:2023-12-03 20:17:56 26 4
gpt4 key购买 nike

我正在为 mongodb 中的一些聚合函数苦苦挣扎。
我想在作者的文档中获取书籍文档,该文档只有书籍 id 作为字符串 id 数组,如下所示:

作者文档

{
"_id" : "10",
"full_name" : "Joi Dark",
"books" : ["100", "200", "351"],
}

和其他文件(书籍):
{
"_id" : "100",
"title" : "Node.js In Action",
"ISBN" : "121215151515154",
"date" : "2015-10-10"
}

所以结果我想要这个:
{
"_id" : "10",
"full_name" : "Joi Dark",
"books" : [
{
"_id" : "100",
"title" : "Node.js In Action",
"ISBN" : "121215151515154",
"date" : "2015-10-10"
},
{
"_id" : "200",
"title" : "Book 2",
"ISBN" : "1212151454515154",
"date" : "2015-10-20"
},
{
"_id" : "351",
"title" : "Book 3",
"ISBN" : "1212151454515154",
"date" : "2015-11-20"
}
],
}

最佳答案

使用 $lookup 它从 from 中的指定集合中检索数据基于localField的匹配到 foreignField :

db.authors.aggregate([
{ "$lookup": {
"from": "$books",
"foreignField": "_id",
"localField": "books",
"as": "books"
}}
])
as是在文档中写入包含相关文档的“数组”的位置。如果您指定现有属性(例如此处完成),则该属性将被输出中的新数组内容覆盖。

如果您有 MongoDB 3.4 之前的 MongoDB,那么您可能需要 $unwind "books" 的数组如 localField第一的:
db.authors.aggregate([
{ "$unwind": "$books" },
{ "$lookup": {
"from": "$books",
"foreignField": "_id",
"localField": "books",
"as": "books"
}}
])

它为原始文档中的每个数组成员创建一个新文档,因此使用 $unwind 再次和 $group 创建原始表单:
db.authors.aggregate([
{ "$unwind": "$books" },
{ "$lookup": {
"from": "$books",
"foreignField": "_id",
"localField": "books",
"as": "books"
}},
{ "$unwind": "$books" },
{ "$group": {
"_id": "$_id",
"full_name": { "$first" "$full_name" },
"books": { "$push": "$books" }
}}
])

如果实际上您的 _id ObjectId 的外部集合中的值类型,但您在 localField 中有值这是它的“字符串”版本,然后您需要转换数据以使类型匹配。没有其他办法。

通过 shell 运行类似这样的东西来转换:
var ops = [];
db.authors.find().forEach(doc => {
doc.books = doc.books.map( book => new ObjectId(book.valueOf()) );

ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$set": { "books": doc.books }
}
}
});

if ( ops.length >= 500 ) {
db.authors.bulkWrite(ops);
ops = [];
}
});

if ( ops.length > 0 ) {
db.authors.bulkWrite(ops);
ops = [];
}

这将转换 "books" 中的所有值数组变为实数 ObjectId实际可以匹配的值 $lookup手术。

关于mongodb - 使用他们的文档聚合填充 id 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44796285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com