MongoDB / Mongoid:可以在嵌入式文档中查询ObjectID吗?

时间:2011-01-02 12:33:52

标签: ruby-on-rails mongodb mongoid

为了记录,我在Rails和MongoDB方面有点新手。

我正在使用Rails + Mongoid + MongoDB来构建应用程序,我注意到Mongoid由于某种原因将ObjectID添加到嵌入式文档中。

有没有办法通过ObjectID查询主要文档和嵌套文档的集合中的所有文档?

如果我运行此命令

db.programs.findOne( { _id: ObjectId( "4d1a035cfa87b171e9000002" ) } )

我得到这些结果是正常的,因为我在根级别查询ObjectID。

{
    "_id" : ObjectId("4d1a035cfa87b171e9000002"),
    "created_at" : "Tue Dec 28 2010 00:00:00 GMT+0000 (GMT)",
    "name" : "program",
    "routines" : [
        {
            "name" : "Day 1",
            "_id" : ObjectId("4d1a7689fa87b17f50000020")
        },
        {
            "name" : "Day 2",
            "_id" : ObjectId("4d1a7695fa87b17f50000022")
        },
        {
            "name" : "Day 3",
            "_id" : ObjectId("4d1a76acfa87b17f50000024")
        },
        {
            "name" : "Day 4",
            "_id" : ObjectId("4d1a76ecfa87b17f50000026")
        },
        {
            "name" : "Day 5",
            "_id" : ObjectId("4d1a7708fa87b17f50000028")
        },
        {
            "name" : "Day 6",
            "_id" : ObjectId("4d1a7713fa87b17f5000002a")
        },
        {
            "name" : "Day 7",
            "_id" : ObjectId("4d1a7721fa87b17f5000002c")
        }
    ],
    "user_id" : ObjectId("4d190cdbfa87b15c2900000a")
}

现在,如果我尝试使用其中一个嵌入文档(例程)查询ObjectID,我会像这样得到null。

db.programs.findOne( { _id: ObjectId( "4d1a7689fa87b17f50000020" ) } )
null

我知道可以像这样查询嵌入对象

db.postings.find( { "author.name" : "joe" } );

但是如果你传递了某种ObjectID并想要在ObjectID所在的文档中找到它,那似乎有点多余。

所以我猜我的问题是这个......

通过ObjectID查询并在嵌入式文档中搜索ObjectID,是否有可能使用我不熟悉的方法?

感谢。

3 个答案:

答案 0 :(得分:3)

您无法像这样全局查询ObjectID。你必须这样做

db.programs.find({"routines._id": ObjectId("4d1a7689fa87b17f50000020")})

答案 1 :(得分:2)

不,您只能按{ "routines._id" : ObjectId("4d1a7689fa87b17f50000020")}

这样的字段进行搜索

答案 2 :(得分:0)

如果您只想获得匹配的子文档,可以使用$ elemMatch' $'运算符如下:

db.programs.find({"_id" : ObjectId("4d1a035cfa87b171e9000002"),
    routines:{$elemMatch:{"_id" : ObjectId("4d1a7689fa87b17f50000020")}}},{"routines.$":1})

它只返回匹配的子文档而不是完整的子文档。