在一个集合中,我正在存储一些数据,这些数据映射到在其他地方生成的移动设备 UID。例如:
{
devices: {
'b2e4fe52d4ab57fd55fa': { model: 'aPhone', number: 1111111 },
'b2e4fe52d4ab57fd55fb': { model: 'bPhone', number: 2222222 },
'b2e4fe52d4ab57fd55fc': { model: 'cPhone', number: 3333333 }
}
}
有没有办法在不使用 UID 的情况下检索代表一个设备的对象?
对于仅在模型或数字上使用 $elemMatch 的数组来说,这很容易,但它的使用似乎仅限于数组,是否有用于文档的模拟运算符?
最佳答案
is there an analogue operator for Documents
没有。没有运算符可以匹配和投影文档中的单个键值对,不知道键。
您必须编写代码来对每个设备文档进行后处理,它可能如下所示:
var devices = db.devices.findOne().devices;
var keys = Object.keys(devices);
for(var i=0;i<keys.length;i++){
var device = devices[keys[i]];
if(device.model == 'aPhone' && device.number == 1111111)
{
print(keys[i]);
// do the processing here
break;
}
}
如果您可以选择更改架构,如下所示,它更加灵活并且看起来逻辑上也是正确的,
db.devices.insert({
devices: [
{"id":"b2e4fe52d4ab57fd55fa", model: 'aPhone', number: 1111111 },
{"id":"b2e4fe52d4ab57fd55fb", model: 'bPhone', number: 2222222 },
{"id":"b2e4fe52d4ab57fd55fc", model: 'cPhone', number: 3333333 }
]
})
然后您可以通过简单的查找和项目查询轻松实现它。
db.devices.findOne({"devices.model":"aPhone",
"devices.number":1111111},
{"devices.$":1})
关于Mongodb - 将嵌套文档与未知键匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180434/