让我直截了当地提问,好吧我有像
这样的文档结构让集合名称为样本;
我不会知道someIdAsString。
{
_id : ObjectId("someObjectId"),
test : {
someIdAsString : {
field1 : value1,
field2 : value2
},
someOtherIdAsString : {}
.....
.....
And so on
}
}
我有field1& field2值如何使用此信息查询集合。
field1& field2将在运行时知道,假设它是field1 ='33'& field2 ='3333',文档如
{
_id : ObjectId("522182515f8wea670900001b"),
test : {
522182515f8c4wd70900001b : {
field1 : '33',
field2 : '3333'
},
522182515f8cea670900001b : {}
.....
.....
And so on
}
}
由于
答案 0 :(得分: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;
})