【问题标题】:How to create model with an array field which contains another documents as an embedded documents in Mongodb (Mongoid)如何使用包含另一个文档的数组字段创建模型作为Mongodb(Mongoid)中的嵌入文档
【发布时间】:2014-10-22 04:06:25
【问题描述】:

我将 Rails 4 与 Mongoid 一起用于基于事件的应用程序。 我正在尝试创建一个模型,我想在该数组中添加一个包含嵌入文档的数组字段。该嵌入文档将包含用户的地理坐标和时间戳。每 5 分钟后,我会将用户的最新坐标推送到用户的(位置)数组。有人可以帮我吗,我该如何创建。

我的示例模型和所需文件如下。

class User
  include Mongoid::Document
  field :name, type: String

  field :locations, type: Array

end

这里我要推

这是我正在寻找的示例文档:

{ _id : ObjectId(...),
  name : "User_name",
  locations : [ {
                 _id : ObjectID(...),
                 time : "...." ,
                 loc : [ 55.5, 42.3 ]
                } ,
                {
                 _id : ObjectID(...),
                 time : "...",
                 loc : [ -74 , 44.74 ]
                }
              ]
}

我能够在不通过 IRB 嵌入文档的情况下将值添加到位置数组中,但由于稍后我将使用 MongoDB 的地理空间查询,所以我想使用 2D 索引和 Mongo 文档提到的其余内容。 因此,我认为它需要包含包含纬度和经度的文档数组。这也将节省我编写代码的时间。

我也可以将位置的时间作为文档 '_id' 吗? (它可以帮助我减少查询开销)

如果有人可以帮助我了解我应该编写的模型结构或指导我参考参考资料,我会非常感激。

P.S:如果您建议一些关于在 mongoDB 中存储地理空间数据的额外参考/帮助,请告诉我,这对我有帮助。

【问题讨论】:

  • 只是在模型定义之外快速移动,将坐标放置在地理空间查询数组中并不是一个好主意。虽然查询会起作用,但要判断数组中的“哪些”条目匹配或“接近”给定的条件并不容易。这是一种数据通常在不同的集合中更好的情况。也许你应该问一些关于你预期的查询模式的问题,以便更好地了解如何首先建模。
  • @NeilLunn 如果我为 location 创建一个不同的集合,然后将其嵌入到用户文档中,它会起作用吗?恐怕用户文档会变得太大而无法处理。这是我第一次使用 NoSQL,因为我正在使用它来提高性能,而且它将成为基于位置的应用程序的简单 API。我希望不时获得用户的坐标,用户数量将达到数千。我希望找到尽可能接近 1-3 米的用户,以便我可以映射他们。你对此有何看法?
  • 正如我评论的一般观点,它可能会帮助您尝试在此处和/或其他列表中发布一些问题来解释您正在尝试做的部分。通常在 NoSQL 中,您首先要解决问题,然后才能找到最佳数据模型,而不是反过来。这个问题真的只是问如何在 mongoid 中编写模型。
  • @NeilLunn 哦,我有一个粗略的算法来处理我需要做的事情,并作为我的项目的结果展示出来。我将处理 psudo 代码/查询,以便我可以直接提问。一般来说,我可以说的是:我将针对成千上万的人群,并在特定区域监控他们。他们将移动坐标,但我必须在任何给定时间相互搜索至少 3 个用户(邻居)。如果不是,用户不在我的雷达范围内。最后,我必须从我给定的位置获取最后常驻用户的列表。这个用户列表是我不断变化的结果。

标签: ruby-on-rails arrays mongodb geospatial mongoid4


【解决方案1】:

希望这会对某人有所帮助。

如果你想嵌入文档,你可以使用 mongoid 的embedded_many 功能,它可以处理这种关系。它还允许您在嵌入式文档上定义索引

http://mongoid.org/en/mongoid/docs/relations.html#embeds_many

Mongoid 指出,二维索引应该应用于数组: http://mongoid.org/en/mongoid/docs/indexing.html

在您的情况下,模型可能如下所示:

class User
  include Mongoid::Document

  field :name, type: String

  embeds_many :locations

  index({ "locations.loc" => "2d" })

  accepts_nested_attributes_for :locations # see http://mongoid.org/en/mongoid/docs/nested_attributes.html#common
end

class Location
  include Mongoid::Document

  field :time, type: DateTime # see http://mongoid.org/en/mongoid/docs/documents.html#fields
  field :loc, type: Array

  embedded_in :user
end

但要注意使用update 和嵌套属性 - 它只允许您更新属性,但不能删除或拒绝它们。最好改用(association)_attributes= 方法:

@user = User.new({ name: 'John Doe' })
@user.locations_attributes = {
  "0" => {
   _id : ObjectID(...),
   time : "...." ,
   loc : [ 55.5, 42.3 ]
  } ,
  "1" => {
   _id : ObjectID(...),
   time : "...",
   loc : [ -74 , 44.74 ]
  }
}
@user.save!

【讨论】:

猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多