为了记录,我在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,是否有可能使用我不熟悉的方法?
感谢。
答案 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})
它只返回匹配的子文档而不是完整的子文档。