【问题标题】:How to create a query to get only N entries from a list in certain record in MongoDB and C#?如何创建查询以仅从 MongoDB 和 C# 中某些记录的列表中获取 N 个条目?
【发布时间】:2016-06-05 16:17:34
【问题描述】:

我需要从 BlockListOfItems 获取最后 12 个条目,其 Name"corner"

public class Block {
    public ObjectId Id { get; set; }
    public string Name;
    public List<Items> ListOfItems;
}

但是由于ListOfItems中可以有很多很多的项目,所以所有的操作都必须在数据库服务器上进行,而不是在本地进行。顺便说一句,这有可能吗?

怎么做?

结论:

这是不可能的,但这是真正的发现:linking, instead of embedding

【问题讨论】:

  • 我认为这是不可能的。您需要从 Mongo 中提取整个 Block 才能访问 ListOfItems。我认为您的数据库架构是这里的问题。
  • @NateBarbettini,你有什么建议? ListOfItems 是否应该在 Block 的外部,并带有将它们绑定在一起的键? (就像 SQL 一样?)
  • ListOfItems 是嵌入还是引用?
  • 是的。一般来说,如果你熟悉领域驱动设计,你会嵌入“价值对象”(即在上下文之外生命无关紧要的东西,例如一个人的电子邮件地址的价值;你不需要改变轨道你只需要当前的)和链接“实体”(在上下文之外有意义的东西,例如,一个地址可能会通过给定系统中的多个所有者,所以你可以在它自己的集合中跟踪它)。
  • 抱歉,有点长。此外,作为一般规则,如果您总是希望它们与包含对象同时被获取,则您嵌入事物。如果您有时想要它们有时不想要它们,那也没关系,但是如果您有一个列表并且只想要基于某些查询参数的其中一些,这开始表明它们具有自己的上下文含义,您可能会考虑将它们分成自己的集合。

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0


【解决方案1】:

ListOfItems 可能应该引用另一个集合,而不是嵌入数组。在查询 MongoDB 时,您可以包含或不包含字段(包括子文档),但我不知道在 MongoDB 端过滤、限制或跳过子文档中的项目的方法。

一般来说,如果您熟悉领域驱动设计,您会嵌入“价值对象”(即在上下文之外其生命无关紧要的事物,例如一个人的电子邮件地址的价值;您不需要要更改跟踪它,您只需要当前的)和链接“实体”(在上下文之外具有意义的事物,例如,地址可能会通过给定系统中的多个所有者,因此您可以在自己的收藏)。

此外,作为一般规则,如果您总是希望它们与包含对象同时被获取,则您嵌入事物。如果您有时需要它们有时不需要,那也没关系,但是如果您有一个列表并且只需要基于某些查询参数的其中一些,这开始表明它们具有自己的上下文含义,您可能会考虑将它们分成自己的集合。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 2017-11-26
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2021-09-06
相关资源
最近更新 更多