jjzjj

mongodb - Sails 和子文档 ObjectId()

coder 2023-10-31 原文

我有一个现有的 MongoDB 集合,基本上看起来像这样:

users: [
{
    "_id": ObjectId("56a6f714a2c56f1c3b0f17f1"),
    "name": "Daniel",
    "phones" : [
        {
            "_id": ObjectId(""56a78dd1879c40ea63822141"),
            "areacode": 333,
            "number": 111111111
        },
        {
            "_id": ObjectId(""56a78dd1879c40ea63822141"),
            "areacode": 111,
            "number": 99999999
        }

    ]

},
{
    "_id": ObjectId("56a6f714a2c56f1c3b0f17f1"),
    "name": "John",
    "phones" : [
        {
            "_id": ObjectId(""56a78dd1879c40ea63822141"),
            "areacode": 333,
            "number": 111111111
        },
        {
            "_id": ObjectId(""56a78dd1879c40ea63822141"),
            "areacode": 111,
            "number": 99999999
        }
    ]

}
]

如您所见,我在子文档中使用对象 ID 将此数据与我们存储有关数字的附加信息的外部集合相关联。所有这些 ID 都是由 Mongoose 在其他自动执行此操作的应用程序中自动生成的。

现在,在 Waterline 中,没有对子文档的架构支持,因此当对集合执行 find() 时,子文档 ObjectId 将作为 JSON 而不是 ID 字符串返回。

这样的结果是

results: [
{
    "id": "56a6f714a2c56f1c3b0f17f1",
    "name": "Daniel",
    "phones" : [
        {
            "_id": {
                "_bsontype": "ObjectID",
                "id": "V§zÐ\u0019}dÒÏ_"
             }
            "areacode": 333,
            "number": 111111111
        },
        {
            "_id": {
                "_bsontype": "ObjectID",
                "id": "V§zÐ\u0019}dÒÏ_"
             }
            "areacode": 111,
            "number": 99999999
        }

    ]

}
]

Mongoose 优雅地处理了这个问题,您始终可以让这些 id 可用于在客户端执行相关查询,但是使用 Waterline 并且没有嵌套模式,这似乎是另一个死胡同。

有没有什么方法可以解决这个问题,而无需在返回之前遍历整个集合、迁移数据库、更改文档或规范化数据库?此数据由多个应用程序访问,需要保持原样。

最佳答案

可能有更好的方法来做到这一点,但最后我决定在返回的 JSON 上递归迭代,用适当的 ObjectID 替换 ID,感谢 bson-objectid图书馆。

我基本上所做的是在模型级别的 toJSON 函数上调用此方法:

// Recursively iterate over a JSON object
function replaceBSONIDs(object){

   var ObjectID = require("bson-objectid");

  for(var x in object){

    if(typeof object[x] == 'object') {
      replaceBSONIDs(object[x]);
    } else {

        // Perform the actual replace of the _id with an object ID
        if('_id' in object) {
            object.id = ObjectID(object._id.id);
            delete object._id           
    }
  }

}

这个问题听起来像是水线错误,所以打开一个问题。希望这对其他人有帮助。

关于mongodb - Sails 和子文档 ObjectId(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017919/

有关mongodb - Sails 和子文档 ObjectId()的更多相关文章

  1. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  2. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  3. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  4. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  5. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  6. Elasticsearch和MongoDB对比 - 2

    文章目录Elasticsearch和MongoDB对比关于ElasticsearchElasticsearch应用场景关于MongoDBMongoDB优点mongodb适用场景Elasticsearch和MongoDB对比Elasticsearch和MongoDB开源许可协议参考Elasticsearch和MongoDB对比关于Elasticsearch官网:https://www.elastic.co/cn/elasticsearch/Elasticistheleadingplatformforsearch-poweredsolutions.Weaccelerateresultsthatma

  7. javascript - 使用渲染功能时 Vue 组件不显示子文本节点 - 2

    我正在尝试用Vue2做一个可编辑的组件。它应该在任何标签中使用contenteditable属性,替换普通输入。我想给它一个占位符功能,以便在用户没有提供任何值时显示一个值,但我似乎无法让它工作。我正在观察组件的当前值,并在不存在用户内容时将data.isEmpty设置为true。该组件随后应显示占位符值,但目前它什么都不显示。如果我console.logrender方法的结果,它将显示占位符子节点已正确实例化,但由于某些原因它不会显示在最终的HTML上。这是一个JSFiddle:https://jsfiddle.net/dy27fa8t/对于那些喜欢它的人来说,还有一个嵌入的片段:V

  8. javascript - 如何在 sails.js 0.10 中接收套接字事件? - 2

    我有一个名为Collection.js的模型,它看起来像这样:module.exports={attributes:{title:{type:'string',required:true},description:{type:'text',required:false},sessions:{collection:'session',via:'collection'}}}据我了解this文档,在创建新模型实例时通过套接字发送的消息,可通过模型名称获得。所以我在我的app.coffee文件中剪下了这个:socket=io.connect()socket.on'collection',->c

  9. javascript - 类型错误 : mongodb property insertmany is not a function - 2

    db.col.insertMany([{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"},{"_id":"tt0796366","title":"StarTrek","year":2009,"type":"movie"},{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"}]);OS:LinuxMint17.3RosaMongoDB:dbversionv2.6.1

  10. javascript - sails .js : post text input and a file in the same time - 2

    我想在表单中发送一个文件和一个隐藏的输入文本。在我的Controller中,request.body等于{}。当我删除enctype="multipart/form-data"它适用于我的文本但不适用于我的文件。上传我的文件:uploadFile.upload({saveAs:fileName,dirname:directoryName},functiononUploadComplete(err,files){...............});我的Controller:importXLS:function(req,res){varuploadFile=req.file('xlsx_f

随机推荐