我认为您正在寻找的是点符号:http ://docs.mongodb.org/manual/reference/glossary/#term-dot-notation
问题一:
db.videos.find( { 'video.blocks.codes.0' : { $exists : true } } )
实际上是否存在数组的第零个元素。为了速度,您在video.blocks.codes
. 另请注意,您将取回一个块内至少包含 1 个非空代码数组的所有视频文档。要计算块,您必须进行客户端处理以删除额外的块。
问题2:
- 在代码数组与给定位置的某个字符串匹配的位置存在多少块?
非常相似的答案。对于位置 3:
db.videos.find( { 'video.blocks.codes.3' : 'the magic code' } )
抱歉,我不认识 Mongoid,但希望您能翻译以上内容。
HTH - 抢。
编辑:
这不起作用,因为块是嵌入的,而代码是块内的数组。
我想我当时不明白这个问题。外壳返回我所期望的。
来自外壳的示例(重新格式化) - 首先是数据:
> db.test.find()
{ "_id" : ObjectId("51b7cfff0ccc6eb8b11c82b1"),
"blocks" : [
{ "index" : 1, "codes" : [ "a", "g", "c" ] },
{ "index" : 2, "codes" : [ ] }
]
}
{ "_id" : ObjectId("51b7d0300ccc6eb8b11c82b2"),
"blocks" : [
{ "index" : 1, "codes" : [ "x", "b", "d", "e" ] },
{ "index" : 2, "codes" : [ "x", "b" ] }
]
}
{ "_id" : ObjectId("51b7d0a50ccc6eb8b11c82b3"),
"blocks" : [
{ "index" : 1, "codes" : [ ] }
]
}
第一个查询:查找包含至少 1 个代码块的所有文档:
> db.test.find( { 'blocks.codes.0' : { $exists : true } } )
{ "_id" : ObjectId("51b7cfff0ccc6eb8b11c82b1"),
"blocks" : [
{ "index" : 1, "codes" : [ "a", "g", "c" ] },
{ "index" : 2, "codes" : [ ] }
]
}
{ "_id" : ObjectId("51b7d0300ccc6eb8b11c82b2"),
"blocks" : [
{ "index" : 1, "codes" : [ "x", "b", "d", "e" ] },
{ "index" : 2, "codes" : [ "x", "b" ] }
]
}
第二个查询:查找所有第 n 个代码为特定值的文档。在这种情况下,我选择了第二个(索引 1)是“g”。
> db.test.find( { 'blocks.codes.1' : "g" } )
{ "_id" : ObjectId("51b7cfff0ccc6eb8b11c82b1"),
"blocks" : [
{ "index" : 1, "codes" : [ "a", "g", "c" ] },
{ "index" : 2, "codes" : [ ] }
]
}