数字键嵌套集合

时间:2017-10-02 12:57:54

标签: mongodb

我如何查询具有数字键的嵌套集合?

当我知道钥匙时,我可以选择一个特定的收藏品,但如果我不知道怎么办?是否有一些“面具/图案”的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

1 个答案:

答案 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