将对象数组转换为虚拟 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(对象数组中的对象数组)

将对象数组转换为mongodb中的字符串数组

怎么把对象数组转换为集合

Laravel 集合将数组转换为对象

将数据从 mongodb 解析为 javascript 数组对象 [重复]

将数据从 mongodb 解析为 javascript 数组对象 [重复]