【问题标题】:converting an array of objects to a virtual mongodb collection将对象数组转换为虚拟 mongodb 集合
【发布时间】: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。

标签: node.js mongodb mongoose aggregation-framework


【解决方案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 的“根”文档中。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2017-06-30
    • 1970-01-01
    • 2015-09-24
    • 2020-08-31
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多