Mongodb - 将嵌套文档与未知键匹配

标签 mongodb

在一个集合中,我正在存储一些数据,这些数据映射到在其他地方生成的移动设备 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/

相关文章:

node.js - Node.js更新文档失败时,最好抛出异常或返回信息吗?

php - 在 MongoDB 中使用组

java - mongodb 中 "between"的查询语法 - 我正在使用 java

node.js - Mongoose 使用 UTC 时间保存和检索日期,更改服务器时区

ruby-on-rails - 使用长度标准查询 MongoDB

mongodb - 在 mongodb 中选择嵌套字段

node.js - 无法连接到 mongolab.com

node.js - 如何在单个 mongo 查询中将一个字段的值分配给另一个字段

javascript - 如何使用多嵌套数组文档查找单个字段

javascript - node-mongodb-native、回调、范围和 TypeError