- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有这样的设置模型数据
[52] pry(main)> Setting.all.to_a
=> [#<Setting _id: 561cc75b25917fdc2300003c, courses: ["521c4578ef8b6038ba000069", "55f909c825917f1ac000003e"], user_id: "55f908d725917f5157000036">,
#<Setting _id: 563b322425917f8117000025, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "560ca6b325917f158d000002", "5617a5f325917ff38c000036", "5632eebc25917f1ace000038", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "56125d7b25917fb8c0000001">,
#<Setting _id: 5641d3b125917fa02f000009, courses: ["5614e62225917fbb1300005f", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "5264b629ef8b604f96000001">,
#<Setting _id: 565d541925917f10da000013, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "5617a5f325917ff38c000036", "560ca6b325917f158d000002", "55f909c825917f1ac000003e", "5632eebc25917f1ace000038", "521c4578ef8b6038ba000069"], user_id: "565d53f525917f10da000012">]
现在我想要一组具有特定类(class)的设置
pry(main)> course = Course.find("5614e62225917fbb1300005f")
pry(main)> Setting.any_of(courses: course.id).to_a
=> [#<Setting _id: 565d541925917f10da000013, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "5617a5f325917ff38c000036", "560ca6b325917f158d000002", "55f909c825917f1ac000003e", "5632eebc25917f1ace000038", "521c4578ef8b6038ba000069"], user_id: "565d53f525917f10da000012">]
它只产生了一个不是预期结果的数组元素,然后
[53] pry(main)> Setting.any_of(courses: course.id.to_s).to_a
=> [#<Setting _id: 563b322425917f8117000025, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "560ca6b325917f158d000002", "5617a5f325917ff38c000036", "5632eebc25917f1ace000038", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "56125d7b25917fb8c0000001">,
#<Setting _id: 5641d3b125917fa02f000009, courses: ["5614e62225917fbb1300005f", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "5264b629ef8b604f96000001">]
产生了两个数组元素,但期望的结果是三个数组元素,可以通过将这两个结果相加或通过以下语法来获得
[57] pry(main)> Setting.any_of({courses: course.id.to_s}, {courses: course.id}).to_a
=> [#<Setting _id: 563b322425917f8117000025, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "560ca6b325917f158d000002", "5617a5f325917ff38c000036", "5632eebc25917f1ace000038", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "56125d7b25917fb8c0000001">,
#<Setting _id: 5641d3b125917fa02f000009, courses: ["5614e62225917fbb1300005f", "55f909c825917f1ac000003e", "521c4578ef8b6038ba000069"], user_id: "5264b629ef8b604f96000001">,
#<Setting _id: 565d541925917f10da000013, courses: ["561cddbb25917fa26e0000b9", "5614e62225917fbb1300005f", "5617a6bd25917f7aa100005d", "5617a5f325917ff38c000036", "560ca6b325917f158d000002", "55f909c825917f1ac000003e", "5632eebc25917f1ace000038", "521c4578ef8b6038ba000069"], user_id: "565d53f525917f10da000012">]
我的困惑是为什么
Setting.any_of(courses: course.id).to_a
和
Setting.any_of(courses: course.id.to_s).to_a
产生不同的结果,我的第三种语法方法是获得我想要的结果的唯一正确方法吗?
最佳答案
我不能 100% 确定,因为我真的不知道您的数据库中有什么。不过,我对这里的问题很有信心。
因为你没有分享你的设置模型定义,我猜它是这样的:
class Setting
include Mongoid::Document
field :courses, type: Array
end
如果这不正确,请告诉我,我会更新答案。鉴于该结构,请查看此窥探 session :
[4] pry(main)> string_id = "563b322425917f8117000025"
=> "563b322425917f8117000025"
[5] pry(main)> object_id = Moped::BSON::ObjectId.from_string("563b322425917f8117000025")
=> "563b322425917f8117000025"
[6] pry(main)> string_id.class.name
=> "String"
[7] pry(main)> object_id.class.name
=> "Moped::BSON::ObjectId"
请注意 Moped::BSON::ObjectId
适用于 Mongoid 3(我恰好安装在这里)。在较新的版本中,它只是 BSON::ObjectId
,因为 Mongoid 4+ 放弃了 Moped gem。
我们可以创建两个不同的对象来表示同一个标识符。一个是 String 实例,另一个是 Moped::BSON::ObjectId 类,Mongoid 在内部使用它来表示同一事物,即 Mongo ObejctId。
为了使事情变得更简单,Mongoid(和 mongo 本身)允许您在某些上下文中使用字符串而不是 ObjectId,但并非总是如此。在某些情况下,对于上面的 Setting 类,它无法知道您是要将 String 实例还是 ObjectId 实例保存到数据库中。因此,它会保存您发送给的任何内容:
[10] pry(main)> st = Setting.new(:courses => [object_id])
=> #<Setting _id: 5694ff9a04572eeb16000001, courses: ["563b322425917f8117000025"]>
[11] pry(main)> st.save
=> true
[12] pry(main)> st2 = Setting.new(:courses => [string_id])
=> #<Setting _id: 5694ffa904572eeb16000002, courses: ["563b322425917f8117000025"]>
[13] pry(main)> st2.save
=> true
[14] pry(main)> Setting.where(:courses => string_id).to_a
=> [#<Setting _id: 5694ffa904572eeb16000002, courses: ["563b322425917f8117000025"]>]
[15] pry(main)> Setting.where(:courses => string_id).to_a == [st2]
=> true
[17] pry(main)> Setting.where(:courses => object_id).to_a == [st]
=> true
因此,变量 st
指向一个 Setting
对象,该对象保存有包含一个 id 的 courses 字段,表示为 Moped::BSON::ObjectId
实例,而 st2
包含相同 id 的纯字符串表示。所以,这两件事看起来是一样的,而且很难发现,因为 Moped::BSON::ObjectID#to_s
方法返回与 String#to_s
完全相同的 id,所以如果您尝试将它打印到 shell session 中,您将无法发现差异。要发现差异,您必须调用 object_id.class.name
并与 string_id.class.name
进行比较。
你可以通过运行这个来证明你的情况是否如此:
all_settings = Setting.any_of({courses: course.id.to_s}, {courses: course.id})
all_settings.each do |a_setting|
puts "Setting #{a_setting.id}:"
a_setting.courses.each do |string_or_object_id|
puts " #{string_or_object_id.class.name} #{string_or_object_id}"
end
end
理想情况下,您应该在此数组中仅使用 String 对象或仅使用 ObjectId 对象,否则您将来会遇到问题。解决这个问题。我建议您使用 Moped::BSON::ObjectId
,因为它映射到自然的 ObjectId Mongo 表示并允许您做一些有趣的事情,如按生成日期查询 ObjectId:
[21] pry(main)> object_id.generation_time
=> 2015-11-05 10:40:36 UTC
希望对您有所帮助:)
关于ruby-on-rails - mongoId 的 any_of activerecord 实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743061/
我不得不跟踪脏东西。它适用于 parent 博士。但是当我更改嵌入或引用的文档时,脏 必须通过文档本身的嵌入/引用来访问。 如何跟踪父文档本身的脏? 最佳答案 我已经整理了 mongoid 扩展来解决
给定一个带有如下扩展的简单嵌入关系: class D include Mongoid::Document embeds_many :es do def m #...
因此,似乎没有任何干净的方法可以通用地允许具有强参数的 Hash 字段。这当然可能是一个强大的参数问题,但我很好奇是否有解决方法。我有一个包含一些字段的模型... field :name, type:
当我尝试查询 Mongoid 条件的结果并仅保留字段不同的文档时,我感到非常沮丧。这样做: Books.all.distinct(:name) ..只返回名称字段,而不是文档。 还使用 uniq此处另
Mongoid 提供了一些 rake 任务,其中之一为数据库中的所有集合创建索引: 耙数据库:创建索引 但是如果我错了请纠正我,创建索引与实际索引所有项目不是不同吗?我怎样才能重新索引我的文档?如果我
我有一个订阅者类,它有 embeds_many 订阅。订阅具有属性状态。我想添加对状态的验证,以便每个订阅者只有一个订阅可以具有“事件”状态。订户可以拥有多个状态为“已购买”或“已过期”的订阅。 最佳
Mongoid 提供方法 create 和 create!比如 Artist.create(name: "Pablo Picasso") 或 Artist.create!(name: "Pablo P
在 Mongoid 2.x 中,可以执行 Mongoid.database.connection.close 来重置数据库连接。这个特定的 API 在 Mongoid3 中不再可用,重置连接的新方法是
我有一个名为“艺术家”的集合,我想将其重命名为“artist_lookups”。我该怎么做? 最佳答案 使用 mongoid5/mongo ruby 驱动程序 2: # if you need t
目前我为我的类(class)设置了 default_scope,但我希望 rails_admin 使用 .unscoped 执行列表查询 有什么办法可以做到这一点吗?我没有看到覆盖 rails_adm
我知道可以通过数据库调用找到它,但出于好奇,例如在 Node 中,如果我有一个 Mongoose 文档 ID 数组。我如何针对该数组模拟 indexOf 函数以确定其中是否有另一个 mongoId?
Mongoid 没有超时选项。 http://mongoid.org/en/mongoid/docs/installation.html 我希望 Mongoid 终止长时间查询。如何设置 Mongoi
我似乎无法在这里或通过Google找到答案,任何帮助都很棒。 建筑物可以正确保存,但是嵌入式文档PriorityArea不会更新... 我想最终让它均匀地为新的优先级区域添加一个新表格,但是需要首先对
根据 github 上 mongoid 的自述文件,我可以做一些奇特的查询,比如Person.select(:first_name, :last_name).where(:title => "Sir"
有谁知道如何索引和搜索embedded documents与 sunpot_mongoid ? 问题已在 sunspot_mongoid issues 中提出,但至今无解。 最佳答案 刚试过。这是一个
我有一个来自 Devise 的模型用户具有这种关系: 用户名 # Relationships references_many :houses, :dependent => :delete 现在我有一
我在控制台上执行此查询,但是我不能简单地复制并粘贴它以在 mongo shell 中执行它。 有什么方法可以将mongoid DSL转换成真正的mongo查询语句。 谢谢 database=test
在文档中它说你可以使用 inverse_of: nil 但并没有真正描述用例: http://mongoid.org/en/mongoid/docs/relations.html#has_and_be
我正在将 mongoid-history gem 添加到我的项目中。 根据指南in github ,当我将 Userstamp 添加到我的跟踪器时,它会创建 created_by 字段,并使用名为 c
Mongoid.master.collection("seq").find_and_modify({ :query => {:_id => self.class.name}, :up
我是一名优秀的程序员,十分优秀!