2013-08-31 185 views
0

让我直接回答这个问题,OK我有文档结构如查询嵌入式文档MongoDB

让集合名称为sample;

我不会知道someIdAsString。

{ 
_id : ObjectId("someObjectId"), 
test : { 
    someIdAsString : { 
     field1 : value1, 
     field2 : value2 
    }, 
      someOtherIdAsString : {} 
      ..... 
      ..... 
      And so on 
    } 
} 

我有FIELD1 & FIELD2值如何查询使用该信息的收集。

字段1 &场2会在运行时被称为可以说,这是字段1 =“33” &场2 =“3333”和像

{ 
_id : ObjectId("522182515f8wea670900001b"), 
test : { 
    522182515f8c4wd70900001b : { 
    field1 : '33', 
    field2 : '3333' 
    }, 
     522182515f8cea670900001b : {} 
     ..... 
     ..... 
     And so on 
    } 
} 

感谢

+1

请举一个实际的收集数据和预期的结果。 –

+0

实际上查询的程序的一部分会使事情变得更加清晰。 – thefourtheye

+0

FIELD1&FIELD2将在运行时被称为 可以说这是FIELD1 = '33' &FIELD2 = '3333' 和类似 '{ _id文档:的ObjectId( “5221828c5f8cea670900as1d”), 测试:{ 5221828c5f8cea670900001d :{ 字段1: '33', 场2: '3333' }, 5221828c5dscea670900001d:{} ..... ..... 等等 }} ,' – Beast

回答

1

的文件,我建议你更改架构,以便此someIdAsString文本成为一个值而不是一个键,使test中的对象成为对象列表。如果你知道每一个键,你可以尝试

db.sample.find({$or: [ 
    {"test.someIdAsString.field1": value1, 
    "test.someIdAsString.field2": value2}, 
    {"test.someOtherIdAsString.field1": value1, 
    "test.someOtherIdAsString.field2": value2}, 
    ... 
]}) 

对于所有“someIdAsString”的可能性。

如果更改结构:

{ 
    _id : ObjectId("someObjectId"), 
    test : [ 
     { 
      _id : someIdAsString, 
      field1 : value1, 
      field2 : value2 
     }, 
     { 
      _id : someOtherIdAsString, 
      field1 : value3, 
      field2 : value4 
     }, 
     ... 
    ] 
} 

您可以查询更改为:

db.sample.find({ 
    "test.field1": value1, 
    "test.field2": value2 
}) 

一种解决方法,同时仍然使用你的数据结构使用查询不知道嵌入式键名将是$where operator中的JavaScript。

db.sample.find(function(){ 
    var ttk; 
    var tt = this.test; 
    for(key in tt){ 
     ttk = tt[key] 
     if(ttk.field1 === value1 && ttk.field2 === value2){ 
      return true; 
     } 
    } 
    return false; 
}) 
+0

谢谢@HD为你的时间, 我想知道是否有方法来使用mongoskin本身进行查询,但我想我找到了答案,它不是我的猜测。 – Beast

+0

我最后一个例子中的函数可以像'{$ match:function(){...}}'或者'{$ match:“(function(tt){...})这样使用。测试)“}'查询,您可能可以在mongoskin的'collection.find'中使用这个查询。 –