查询嵌入式文档MongoDB
让我直接回答这个问题,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
}
}
感谢
的文件,我建议你更改架构,以便此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;
})
谢谢@HD为你的时间, 我想知道是否有方法来使用mongoskin本身进行查询,但我想我找到了答案,它不是我的猜测。 – Beast
我最后一个例子中的函数可以像'{$ match:function(){...}}'或者'{$ match:“(function(tt){...})这样使用。测试)“}'查询,您可能可以在mongoskin的'collection.find'中使用这个查询。 –
请举一个实际的收集数据和预期的结果。 –
实际上查询的程序的一部分会使事情变得更加清晰。 – thefourtheye
FIELD1&FIELD2将在运行时被称为 可以说这是FIELD1 = '33' &FIELD2 = '3333' 和类似 '{ _id文档:的ObjectId( “5221828c5f8cea670900as1d”), 测试:{ 5221828c5f8cea670900001d :{ 字段1: '33', 场2: '3333' }, 5221828c5dscea670900001d:{} ..... ..... 等等 }} ,' – Beast