Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在MongoDB中查询文档数组_Arrays_Mongodb - Fatal编程技术网

Arrays 如何在MongoDB中查询文档数组

Arrays 如何在MongoDB中查询文档数组,arrays,mongodb,Arrays,Mongodb,我有一个像这样的对象数组: { "actions": [{ "help": { "messages": [{}, {}] } }, { "animals": [{ "sea": { "messages": [{}, {}]

我有一个像这样的对象数组:

{
    "actions": [{
        "help": {
            "messages": [{}, {}]
        }
    }, {
        "animals": [{
            "sea": {
                "messages": [{}, {}]
            }
        }, {
            "land": {
                "messages": [{}, {}]
            }
        }]
    }]
}
我试图从每个元素获取
消息
数组。(仅匹配的一个)

我试过这样的方法:

db.getCollection('responses').find({"actions": "help"})
{
    "actions": [{
        "action": "help",
        "messages": [{}, {}]
    }, {
        "action": "animals",
        "classifications": [{
            "classification": "sea",
            "messages": [{}, {}]
        }, {
            "classification": "land",
            "messages": [{}, {}]
        }]
    }]
}

没有运气,因为我仍然得到一个空数组

如果这是不可能的,我是开放的替代品

我一直在寻找类似这样的问题:但在这个问题中,他们正在寻找“messages”对象(在我的例子中)中的特定元素。与另一个问题相同:他们在哪里使用
$elementMatch
,我认为这不符合我的需要

我认为在Mongo教程中:可能会有帮助,但同样,它们的结构与我的类似,但它们有
help
元素的属性,例如:

db.getCollection('responses').find({"actions": "help"})
{
    "actions": [{
        "action": "help",
        "messages": [{}, {}]
    }, {
        "action": "animals",
        "classifications": [{
            "classification": "sea",
            "messages": [{}, {}]
        }, {
            "classification": "land",
            "messages": [{}, {}]
        }]
    }]
}
这是唯一可行的方法吗?或者我还能保持我原来的结构吗

编辑 在尝试@Graciano的答案后,我得到了以下信息:

db.getCollection('responses').aggregate([{
    $project: { "messages":  "$actions.animals.sea.messages" }
}])
结果:

/* 1 */
{
    "_id" : ObjectId("5ac42e65734d1d5beda1f99b"),
    "messages" : [ 
        [ 
            [ 
                {
                    "type" : 0,
                    "speech" : "There are a lot of sea animals, to name a few: "
                }, 
                {
                    "type" : 0,
                    "speech" : "Whale\nFishes\nSharks"
                }
            ]
        ]
    ]
}

现在要解决的错误是它必须是单个数组,而不是消息数组的数组。。。如何解决此问题?

如果您只需要消息,则可以使用聚合并从所需元素创建数组

db.collection.aggregate([
  {$project: { items:  "$actions."+parameter+".messages" },
  {$unwind: "$messages"},
  {$unwind: "$messages"}
}])

如果您只需要消息,则可以使用聚合并从所需元素创建数组

db.collection.aggregate([
  {$project: { items:  "$actions."+parameter+".messages" },
  {$unwind: "$messages"},
  {$unwind: "$messages"}
}])

我刚刚更新了您的查询,现在它将如下所示:

db.collection.aggregate([
{$project: { "messages":  "$actions.animals.sea.messages" }},
{$unwind: "$messages"},
{$unwind: "$messages"}

])
结果将是:


现在,您将只获得一个数组,您只需分别对数组执行
$unwind

我刚刚更新了您的查询,现在它将如下所示:

db.collection.aggregate([
{$project: { "messages":  "$actions.animals.sea.messages" }},
{$unwind: "$messages"},
{$unwind: "$messages"}

])
结果将是:


现在,您将只获得单个数组,您只需分别执行
$unwind
数组。

我需要消息,但只需要从匹配的操作中获得消息,即,如果
help
被发送到查询,那么我可能只从中获得
help
消息数组。在这种情况下,
$concatarray
可能不需要,对吗?它可以工作,但是您的代码中有一些拼写错误,我可以在您的回答中更正吗?还是你想自己改正?而且它在数组中创建了第二个数组更正了错误,让我给我的问题添加一个编辑,这样你就可以看到我得到的输出。不清楚你想要的输出是什么。正如@Rahul Raj在下面所评论的,您只需要添加操作i需要消息,但只需要来自匹配的操作,即如果
help
被发送到查询,那么我可能只从查询中获得
help
消息数组。在这种情况下,
$concatarray
可能不需要,对吗?它可以工作,但是您的代码中有一些拼写错误,我可以在您的回答中更正吗?还是你想自己改正?而且它在数组中创建了第二个数组更正了错误,让我给我的问题添加一个编辑,这样你就可以看到我得到的输出。不清楚你想要的输出是什么。正如@Rahul Raj在下面所评论的,您只需要添加操作就可以提供一个包含混合数据的样本数据集(其中包含空数组和非空数组)。我在您的示例数据集中没有看到
speech
键。只是在您的查询中添加了一个带有编辑的答案,请检查它并让我知道这是否有效。您能否提供一个包含混合数据(其中包含空数组和非空数组)的示例数据集。我在您的示例数据集中没有看到
speech
键。只是在您的查询中添加了一个带有编辑的答案,请检查它并让我知道这是否有效。