gpt4 book ai didi

mongoDB 中的 Ruby 和重复字段

转载 作者:可可西里 更新时间:2023-11-01 09:27:32 27 4
gpt4 key购买 nike

我遇到多个同名字段的问题。

让我们考虑以下代码:

    mongo_client = MongoClient.new("localhost", 27017)
db = mongo_client.db("mydb")
coll = db.collection("test")
coll.remove

#create an entry
customer = {:id => 321, :name => "test customer"}
coll.save customer

#find the entry and modify it
customer = coll.find(:id => 321).to_a.first
customer[:name] = "test customer 2"
coll.save customer

#find again and print
customer = coll.find(:id => 321).to_a.first
pp customer

输出符合预期:

{"_id"=>BSON::ObjectId('52e254c5990300785b000001'),
"name"=>"test customer 2",
"id"=>321}

但是 robomongo 显示现在有两个 name 字段: enter image description here

这很奇怪。

所以我的两个问题是:

  1. 如何修复我的数据库?
    • 修复方式:遍历所有文档;测试我要保留的两个同名字段中的哪一个;删除错误的字段并重新保存文档。
    • 这里的问题是我无法访问两个同名字段,因为文档被映射到 ruby​​ 散列中...
  2. 首先我该如何预防这种情况?

最佳答案

我无法直接回答您的问题,但可以解释为什么您在 Ruby 程序中只看到一个带有“名称”的字段,而 Robomongo 显示两个字段:

查看此页面上的“字段名称”部分:http://docs.mongodb.org/manual/core/document/

它说:

BSON documents may have more than one field with the same name. Most MongoDB interfaces, however, represent MongoDB with a structure (e.g. a hash table) that does not support duplicate field names. If you need to manipulate documents that have more than one field with the same name, see the driver documentation for your driver.

Some documents created by internal MongoDB processes may have duplicate fields, but no MongoDB process will ever add duplicate fields to an existing user document.

所以看起来您的 MongoDB for Ruby 确实将文档映射到不支持重复字段名称的哈希结构。

也许暂时切换到 Robomongo 使用的驱动程序可以帮助解决您的问题。之后您可以返回使用 MongoDB。

根据您的 MongoDB 版本,我认为您可以通过将 --objcheck 传递给 mongod 进程来防止文档中出现重复的字段名称。

手册摘录:

--objcheck Forces the mongod to validate all requests from clients upon receipt to ensure that clients never insert invalid documents into the database. For objects with a high degree of sub-document nesting, --objcheck can have a small impact on performance. You can set --noobjcheck to disable object checking at run-time. Changed in version 2.4: MongoDB enables --objcheck by default, to prevent any client from inserting malformed or invalid BSON into a MongoDB database.

希望对您有所帮助!

关于mongoDB 中的 Ruby 和重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21333250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com