我有一个像这样的对象数组:
{
"actions": [{
"help": {
"messages": [{}, {}]
}
}, {
"animals": [{
"sea": {
"messages": [{}, {}]
}
}, {
"land": {
"messages": [{}, {}]
}
}]
}]
}
我正在尝试从每个元素中获取messages
数组。 (只有匹配的一个)
我尝试过类似的事情:
db.getCollection('responses').find({"actions": "help"})
和
db.getCollection('responses').find({"actions.animals": "sea"})
没有运气,因为我仍然得到一个空阵列。
如果无法做到这一点,我愿意接受替代方案。
我一直在寻找类似这样的问题:Mongo db - Querying nested array and objects但是在那个问题中他们正在寻找“messages”对象(在我的例子中)中的特定元素。与其他问题相同:Query for a field in an object in array with Mongo?他们使用的是$elementMatch
,我认为这不符合我的需求。
我认为在Mongo教程中:Query array of documents可能有所帮助,但同样,它们具有类似于我的类似结构,但它们具有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"
}
]
]
]
}
现在要解决的错误是它必须是单个数组,而不是消息数组的数组数组......如何解决这个问题?
答案 0 :(得分:1)
如果你需要的只是消息,你可以使用聚合并从你想要的元素创建一个数组
db.collection.aggregate([
{$project: { items: "$actions."+parameter+".messages" },
{$unwind: "$messages"},
{$unwind: "$messages"}
}])
答案 1 :(得分:1)
我刚刚更新了您的查询,现在看起来像这样:
for (String name : url_maps.keySet()) {
customSliderView = null;
customSliderView = new CustomSliderView(getApplicationContext());
// initialize a SliderLayout
customSliderView
//.description(name)
.image(url_maps.get(name))
.setScaleType(BaseSliderView.ScaleType.CenterCrop);
//.setOnSliderClickListener(this);
mDemoSlider.addSlider(customSliderView);
}
mDemoSlider.setPresetTransformer(SliderLayout.Transformer.DepthPage);
mDemoSlider.setDuration(MY_DURATION);
mDemoSlider.startAutoCycle(MY_DURATION, MY_DURATION, true);
db.collection.aggregate([
{$project: { "messages": "$actions.animals.sea.messages" }},
{$unwind: "$messages"},
{$unwind: "$messages"}
])
现在你只得到一个数组,你需要分别做{
"_id" : ObjectId("5ac5b80dd39d9355012f6af3"),
"messages" : [
{
"type" : 0,
"speech" : "There are a lot of sea animals, to name a few: "
},
{
"type" : 0,
"speech" : "Whale\nFishes\nSharks"
}
]
}
数组。