在mongodb中查找子阵列中的文档

时间:2014-06-02 16:13:33

标签: ruby-on-rails ruby mongodb

我有很多这样的收藏品

{
"_id" : 383566,
"horses" : {
    "609075" : {
        "_id" : 609075,
        "name" : "Aghawonan"
    },
    "634478" : {
        "_id" : 634478,
        "name" : "French Thyne"
    },
    "595535" : {
        "_id" : 595535,
        "name" : "Doctor Hanley"
    },
    "593718" : {
        "_id" : 593718,
        "name" : "Ballyhill Boy"
    },
    "578089" : {
        "_id" : 578089,
        "name" : "Oh Alabama"
    },
    "632597" : {
        "_id" : 632597,
        "name" : "Bowling Alone"
    },
    "525424" : {
        "_id" : 525424,
        "name" : "Tally-Ho Duke"
    }
}

我需要在数组中找到Horses _id匹配的所有集合

我的版本,但不起作用

db.cards.find({'horses': {$elemMatch: {_id:525424}}})

1 个答案:

答案 0 :(得分:1)

在您的示例中,horses不是数组,而是对象。这个数据结构有点奇怪和多余,因为id都是&name;的一部分。 (或路径,如果你愿意)和实际的文件数据。在您的数据结构中,您可以通过horses.609075.name引用特定的马,但这通常不是很有帮助。

如果horses是这样的数组,那么您的查询将起作用:

{
  "_id" : 383566,
  "horses" : [
    {
        "_id" : 609075,
        "name" : "Aghawonan"
    },
    {
        "_id" : 634478,
        "name" : "French Thyne"
    },
    // ...
   ]
 }

由于您只查询单个属性,因此不需要$elemMatch。您可以像这样查询:

db.cards.find({"horses._id" : 609075});

请注意,您将收到整张卡片,而不仅仅是阵列的一部分。

作为旁注,为什么马的ids称为_id?名称_id仅在根级别是一个特殊字段。嵌入式文档没有任何特殊字段。