如何查询MongoDB中的文档数组

时间:2018-04-05 03:24:50

标签: arrays mongodb

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

{
    "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"
                }
            ]
        ]
    ]
}

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

2 个答案:

答案 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);

结果将是: enter image description here

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" } ] } 数组。