我如何查询具有数字键的嵌套集合?
当我知道钥匙时,我可以选择一个特定的收藏品,但如果我不知道怎么办?是否有一些“面具/图案”的kine?我是mongodb的新手,所以我还在苦苦挣扎。
收集示例:。
{
"_id" : ObjectId("598842f22605c6cb8de9db78"),
"17" : {
"name" : "some name 1",
},
"18" : {
"name" : "some name 2",
},
"19" : {
"name" : "some name 3",
}
},
{ ... }
我能做什么(当我知道数字键时选择):
db.getCollection('my.collection').find({'17.name' : 'some name 1'});
到目前为止,我的搜索没有结果,至少有人能指出我正确的方向吗? 我期待的是什么:
db.getCollection('my.collection').find({'#.name' : 'some name 1'}); <-- return every record from collection that has specified name and any numerical key
答案 0 :(得分:0)
CrazySabbath,在这种情况下,您嵌套文档,而不是嵌套集合。 MongoDB文档可以嵌套其他文档,这是一个嵌入式文档。
使用mongo shell,您可以直接使用集合名称进行查询,例如(无需使用.getCollection()
):
db.myCollection.find({...})
在查询的情况下,使用点表示法对嵌套文档键的“掩码”进行查询是不可能的,因为在访问嵌入文档之前需要指向右侧字段的指针。从您的示例中,更好的文档结构实际上是一个文档数组,数字作为ID,如下:
{
"_id" : ObjectId("598842f22605c6cb8de9db78"),
"nested":[
{
"_id": "17", "name" : "some name 1"
},
{
"_id": "18", "name" : "some name 2"
},
{
"_id": "19", "name" : "some name 3"
}
]
}
有了这个,您也可以使用点表示法查询它,但如果您不知道ID,您可以(例如):
db.myCollection.find({"nested._id": {$gt: "17"}})
// This will return all documents in the collection myCollection that has at least one nested document in its nested array with _id greater than "17"
相反,如果您只想返回嵌套文档,则可以对文档返回进行投影,例如(使用问题中的结构):
db.myCollection.find({"17.name": "some name 1"}, {"_id": 0, "18":0, "19": 0}) //= {"17" : { "name" : "some name 1" } }
//This will find a document with nested "17" (the key for a nested document) that has name as "some name 1", but projecting only the "17" document
如果您只需要使用嵌套文档而不关心嵌套文档,那么这里更好的结构是将这些“17”,“18”和“19”放在不同的集合中,使用这些数字作为ID。见dot notation documentation