【问题标题】:MongoDB/Mongoid: Can one query for ObjectID in embedded documents?MongoDB/Mongoid:可以在嵌入式文档中查询 ObjectID 吗?
【发布时间】:2011-06-02 11:28:45
【问题描述】:

郑重声明,谈到 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?

谢谢。

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    不,您只能按{ "routines._id" : ObjectId("4d1a7689fa87b17f50000020")} 等字段搜索

    【讨论】:

      【解决方案2】:

      您不能像这样在全局范围内查询 ObjectID。你必须这样做

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 1970-01-01
          • 2015-02-06
          • 1970-01-01
          • 1970-01-01
          • 2015-04-23
          • 1970-01-01
          • 2021-08-07
          • 2021-03-24
          相关资源
          最近更新 更多