将对象数组转换为虚拟 mongodb 集合
Posted
技术标签:
【中文标题】将对象数组转换为虚拟 mongodb 集合【英文标题】:converting an array of objects to a virtual mongodb collection 【发布时间】:2022-01-13 11:43:31 【问题描述】:let serviceData = await getServiceData();
我正在从外部服务获取一些数据,该服务是一个对象数组,例如:
[
_id
x
y
,
...
]
有什么方法可以在查找阶段使用此结果而不实际将其创建为数据库中的集合?我想为另一个集合创建一个聚合,其架构类似于
new Schema(
_id
a
b
);
然后进行如下查找:
from: serviceData,
localField: "_id",
foreignField: "_id",
as: "data"
最后得到
[
_id
x
y
a
b
,
...
]
【问题讨论】:
Clarity:您是否尝试使用serviceData
作为_id
的目标列表在另一个集合中查找?
@BuzzMoschetti 我想加入他们,就像我们在查找阶段一样使用集合并获取所有属性,包括 x 和 y。
【参考方案1】:
试试这个:
$set:
data:
$filter:
input: serviceData,
cond: $eq: ["$$this._id", "$_id"]
【讨论】:
我想要加入后的所有字段。请查看更新。 这就是你得到的。也许提供一些真实的样本数据和所需的输出。【参考方案2】:您已经在客户端代码中有serviceData
,所以您只需将$match
加入您的目标集合,然后像这样在客户端“加入”材料:
var svcdata = [
_id: 1, x: 3, y: 7 ,
_id: 2, x: 8, y: 9
];
// Create an array of _id from the given serviceData:
var zzz = svcdata.map(x => x['_id']);
// Create a key lookup dictionary (_id => rest of serviceData).
// All fields will be picked up; no need to enumerate
// x, y, z, etc.:
var svcdict = ;
svcdata.forEach(function(item)
svcdict[item['_id']] = item;
);
// This is all you need to find the material in your collection:
c=db.foo.aggregate([
$match: _id: $in: zzz
]);
// As you pull each doc from the DB, key-match on _id and add it
// to the materal:
c.forEach(function(doc)
doc['svcdata'] = svcdict[doc['_id']];
printjson(doc);
);
它最终看起来像这样:
"_id" : 1,
"name" : "N1",
"svcdata" :
"_id" : 1,
"x" : 3,
"y" : 7
"_id" : 2,
"name" : "N2",
"svcdata" :
"_id" : 2,
"x" : 8,
"y" : 9
这是一种“安全”的方法,因为您可以避免传入的 serviceData
字段与文档中的字段发生名称冲突,即它是命名空间的。当然,您可以根据自己的选择对svcdict[doc[_id]]
进行通用迭代,并将每个字段推送到来自 MongoDB 的“根”文档中。
【讨论】:
以上是关于将对象数组转换为虚拟 mongodb 集合的主要内容,如果未能解决你的问题,请参考以下文章
将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)