如何在 MongoDB 中同时使用两个投影?

问题描述 投票:0回答:2

我需要从以下格式的文档中检索数据:

{
    "id": ObjectId("alskdjflqkjwr23"),
    "field1": {
        "morefields": values
    },
    "field2": {
        "morefields": values
    },
    "field3": {
        "morefields": values
    },
    "field14": {
        "morefields": values
    },
    "importantField": {
        "subfield1": values,
        "subfield2": values,
        "importantArray": [
            {
                "subsubfield1": values,
                "importantSubArray": [
                    {
                        "subsubsubfield1": values,
                        "subsubsubfield2": values
                    },
                    {
                        "subsubsubfield1": values,
                        "subsubsubfield2": values
                    }
                ],
                "importantValue": values
            },
            {
                "subsubfield1": values,
                "subsubfield2": values,
                "subsubfield3": values
            }
        ]
    }
}

我需要 importantSubArray 字段中的 importantValue 和元素,但如果没有其他字段中的所有额外数据,我无法让查询返回我需要的内容。我一周前才开始使用 Mongo。

我已经尝试过这个查询,但只有一个投影有效,具体取决于我放置它们的顺序。所以我可以只返回 importantField 中的数组,但返回所有 400 个左右的元素,而不仅仅是最后 2 个,或者我可以返回 importantField.importantArray 的最后 2 个元素,还可以返回所有其他字段、子字段、子子字段等。

db.getCollection("my_data").find({}, 
    { 
        "importantField.importantArray" : 1.0,
        "importantField.importantArray": { $slice: -2 }
    }
);

我怎样才能让这两个同时工作?谢谢。

编辑:

预期的输出应该如下所示。我需要 importantSubArray 数组和 importantValue 字段中的元素

{
    "importantSubArray": [
       {
            "stuff": morestuff
       },
    ],
    "importantValue": value
mongodb mongodb-query nosql
2个回答
0
投票

我能够通过使用聚合并在第一阶段投影我想要的字段,然后在第二阶段进行另一个投影并对最后 2 个元素进行切片,将 @prasad_ 的评论与切片结合起来。


0
投票
db.my_data.aggregate([ 
{ 
    $project:{ 
        "importantArray":{
            $slice:["$importantField.importantArray", -2]
            }
        }
},
{
    $project:{
        "importantArray.importantSubArray":1, "importantArray.importantValue":1,_id:0
    }
},
{
    $unwind:"$importantArray"
},
{
    $replaceRoot:{newRoot:"$importantArray"}
}

])

上述查询的解释:

  1. $project:使用切片仅选择最后两个元素。
  2. $project:从 importantArray 中选择 importantSubArray 和 importantValue 字段,并排除 _id。
  3. $unwind:为数组中的每个元素创建一个文档。
  4. $replaceRoot:用 importantArray 字段的内容替换每个文档的根。
© www.soinside.com 2019 - 2024. All rights reserved.