社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

Jitendra

Jitendra 最近回复了
6 年前
回复了 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" } }
  )  
6 年前
回复了 Jitendra 创建的主题 » 从MongoDB(v3.4)文档中仅获取子数组[副本]

您也可以尝试以下操作:

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

尝试如下操作:

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