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
键。只是在您的查询中添加了一个带有编辑的答案,请检查它并让我知道这是否有效。