【问题标题】:Accessing an array nested in a dictionary in an array object访问嵌套在数组对象中的字典中的数组
【发布时间】:2013-12-20 23:25:49
【问题描述】:

我创建了一个聚合查询,它使用“parts”键作为“_id”并返回数组中关联的所有“subparts”数字。聚合查询的输出是不可取的,因为我得到了包含 74755 个字典对象的数组“结果”。每个对象都包含一个用于 _id 的 int 32 和一个用于“#associated_subparts”的数组。我可以通过以下方式访问子元素:

db.agg_result.find({}, {_id: 0, result: { $slice: [0,2]}})      

但这只是一种定位方法。我尝试了嵌套的 $elemMatch 和 $all 查询的变体,但没有成功。例如,我希望能够返回 id 为 468183339 的对象。我可能错误地投影了我的原始聚合查询,但我想返回一个没有嵌套的集合,因此集合中的每个对象都是这些部分 > 子部分对象之一。

示例查询:

var agg_out = db.collection.aggregate( { $group :{ '_id' : "$parts#",
    'associated_subparts#' : { $addToSet : "$sub_part" }}});
db.agg_result.insert(agg_out);
db.agg_result.find();

示例输出:

{
    "_id" : ObjectId("52b4c4c6e984c01d69ff176f"),
    "result" : [ 
        {
            "_id" : 468183339,
            "associated_subparts#" : [ 
                -1408237536
            ]
        }, 
        {
            "_id" : 782155933,
            "associated_subparts#" : [ 
                -1408237536
            ]
        }, 
        {
            "_id" : 1583659973,
            "associated_subparts#" : [ 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535, 
                -1408237535
            ]
        }
]
}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果我这次正确理解您的问题,填充 agg_result 集合的正确方法是在将“结果”索引的每个子项插入 agg_result 集合之前迭代聚合查询结果文档的结果字段,一些喜欢:

    agg_out.result.forEach(function(x){db.agg_result.insert(x);});
    

    【讨论】:

    • 嗨,Calimero,也许我不清楚,我想保持一对多的关系。这样我就可以看到与独特部分相关的所有子部分。例如,汽车 A 会有车轮 X、轮胎 Y 等。展开会让我得到汽车 A - 车轮 X,然后是另一个记录汽车 A - 轮胎 Y。
    • 感谢您的澄清,也很抱歉造成误解 - 刚刚意识到您对当前的聚合查询做了完全相反的事情,并且您发布了结果集合。希望我的下一次更新会更有帮助!
    • 啊,感谢您让我重新阅读我刚刚将“示例数据”更改为“示例结果”,这令人困惑。
    • 更新了答案。虽然尚未对其进行测试,但它应该可以按您的预期工作。
    • 看起来你做到了我的朋友 :) 我猜首先没有办法获得这样的聚合输出,所以我必须添加这个额外的 proc 时间。 _id 从 int 转换为 double,并在原始 _id 编号(部分#)后附加了 '.000000',有没有办法指定 _id 保持不变?我知道如何在事后转换变量,但我不想增加额外的计算开销:db.collection.find({_id : {$exists : true}}).forEach(function(obj) { obj._id = new NumberInt(obj._id);
    猜你喜欢
    • 2013-10-06
    • 2021-05-30
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多