私信  •  关注

Jitendra

Jitendra 最近回复了
5 年前
回复了 Jitendra 创建的主题 » MongoDB-NoSQL中的子结构与平面数据结构

MongoDB提供了多种数据建模模式和模式设计,我将分享我的经验,我遇到了哪些问题,不同的数据库模式有哪些好处。我们将在下面逐一讨论:

  1. 嵌入式与平面数据结构: 在这种情况下,这两种模式之间没有太大的区别,但在嵌入式形式的数据模型中,我们将相似类型的数据分组,这样可以使您的查询变得简单或小一些,而您将从任何集合中获取项目数据。

    例如:如果要获取完整的地址,那么在嵌入文档的情况下,不需要单独地$project address字段;如果要在获取文档时跳过地址字段,则不需要单独地跳过地址字段。

  2. 嵌入式(一对一)与嵌入式(一对多): 当我们讨论嵌入式文档在平面数据结构上的好处时,但是如果我们的用户有多个地址,那么我们需要寻找具有一对多关系的嵌入式文档。
    定义一对一和一对多关系的架构如下:

一对一关系模式:

{
_id: String,
name: {
    first: String,
    last: String,
    }
email: String,
address: {
    street: String,
    city String,
    zip: Number,
    }
}

一对多关系模式:

  {
    _id: String,
    name: {
        first: String,
        last: String,
        }
    email: String,
    address: [{           // Embedded address doc with one to many relationship
        street: String,
        city String,
        zip: Number,
      }]
  }

在一对一关系的情况下,它不会对查询部分有太大的影响,但是如果您使用一对多关系,那么查询中将有许多概念上的更改。

例如:由于在更新这两种数据结构时,我们主要面对不同的场景,因此我将分享更新查询之间的差异。

要更新嵌入一对一关系的数据,只需使用点表示法。

db.collection.update(
   { _id: 'anyId' },
   { $set: { "address.street": "abc" } }
)   

要更新嵌入一对多关系的数据,需要使用$operator。在这个例子中有两种不同的情况。首先,如果要更新子文档的特定元素,然后如果要更新所有子文档:

案例1查询将(使用 $ operator ):

  db.collection.update(
       { 'address.streent': 'abc' },
       { $set: { "address.$.street": "xyz" } }
  )   

案例2查询将(使用 $[] ):

  db.collection.update(
       { 'address.streent': 'abc' },
       { $set: { "address.$[]": "xyz" } }
  )  
5 年前
回复了 Jitendra 创建的主题 » 从MongoDB(v3.4)文档中仅获取子数组[副本]

您也可以尝试以下操作:

db.collection.aggregate(
    { $unwind: '$someArray' },
    {
        $project: {
            'filteredValue': {
                $filter: {
                  input: "$someArray.someNestedArray",
                  as: "someObj",
                  cond: { $eq: [ '$$someObj.name', 'delete me' ] }
                }
            }
        }
    }
)
5 年前
回复了 Jitendra 创建的主题 » MongoDB如何为嵌套数组生成投影过滤器

尝试如下操作:

db.article.aggregate(
    { $unwind: '$ArticleInfo' },
    {
        $project: {
            'A': {
                $filter: {
                  input: "$ArticleInfo.InfArt.langs",
                  as: "item",
                  cond: { $eq: [ '$$item.code', 4 ] }
                }
            }
        }
    }
)