具有嵌入式文档的MongoDB findOne()和updateOne()

非线虫

假设我得到了以下文档,其中包含嵌入文档的数组:

{
    "name" : "test",
    "children" : [
        {
            "name" : "child1",
            "children" : [
                {
                    "name" : "sub1",
                    "children" : [
                        {"name" : "c1"},
                        {"name" : "c2"},
                        {"name" : "c3"},
                        {"name" : "c4"},
                        {"name" : "c5"}
                    ]
                }
            ]
        }, 
        {
            "name" : "child2",
            "children" : [
                {
                    "name" : "sub2",
                    "children" : [
                        {"name" : "c1"},
                        {"name" : "c2"},
                        {"name" : "c3"},
                        {"name" : "c4"}
                    ]
                }, 
                {
                    "name" : "sub3",
                    "children" : [
                        {"name" : "c1"},
                        {"name" : "c2"},
                        {"name" : "c3"},
                        {"name" : "c4"}
                    ]
                }, 
                {
                    "name" : "sub4",
                    "children" : [
                        {"name" : "c1"},
                        {"name" : "c2"},
                        {"name" : "c3"},
                        {"name" : "c4"}
                    ]
                }
            ]
        }
    ]
}

我们可以看到,test有两个孩子:child1child2,而一个孩子都有自己的孩子一样sub1sub2sub3sub4,等,等。当前,我必须更新一些子级内容,但是遇到以下两个问题:

第一个问题是关于findOne(),当我不小心打错字(名称child1应为child2)时:

db.collection_name.findOne({
    'name': 'test',
    'children.name': 'child1',  // -> should be `child2`
    'children.children.name': 'sub2'
})

我仍然可以正确获取文档“测试”,但是由于我输入了错误并且sub2实际上位于child2,而不是之下child1,那么我如何仍然可以获得此正确findOne()结果?

第二个问题是关于updateOne(),当我尝试更新child1的array时children,它运行良好(代码也类似于官方文档中的示例):

db.collection_name.updateOne({
    'name': 'test',
    'children.name': 'child1'  // locate child1
}, {
    '$set':{'children.$.children':[some other content]}
})

但是,当我也尝试更新sub3的数组(在之下child2)时,同样的方法因error失败cannot use the part (children of children.children.1.children) to traverse the element,这是有问题的代码:

db.collection_name.updateOne({
    'name': 'test',
    'children.name': 'child2',
    'children.children.name': 'sub3'  // locate sub3
}, {
    '$set':{'children.children.$.children':[some other content]}
})

如果有人可以帮助解决这两个问题,我将非常感激,在此先感谢您!

塞尔坎·阿尔斯兰

对于第一个问题,您可以使用$elemMatch查找确切的元素。

db.collection_name.findOne({
   'name':'test',
   children:{
      $elemMatch:{
         'name':'child2',
         'children.name':'sub2'
      }
   }
})

我猜想mongo不支持多个嵌套数组更新,但是如果您知道子数组的位置,则可以使用此方法。

db.collection_name.updateOne({
  'name':'test',
   children:{
      $elemMatch:{
         'name':'child2',
         'children.name':'sub3'
      }
   }
}
, {
    $set: {"children.$.children.1.children" : 
                    [
                        {"name" : "c1"},
                        {"name" : "c2"},
                        {"name" : "c3"},
                        {"name" : "c4"}
                    ]
         }
}
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中将$ addToSet和upsert用于具有特定JSON的嵌入式文档

MongoDB查询-聚合和嵌入式文档

回送和MongoDB嵌入式文档定义JSON模型

MongoDB对数组和嵌入式文档的条件验证

MongoDB嵌入式文档的区别和过滤器

_id的Mongoose findOne嵌入式文档

spring-data-mongodb:findAll()带有输入文档列表和嵌入式DBRef文档的搜索参数

在文档中引用文档的嵌入式数组的嵌入式数组上查询Doctrine2和MongoDB

使用聚合查询获取具有总交易数和交易明细的用户列表作为嵌入式文档

具有内在函数和汇编的嵌入式广播

具有JSON和嵌入式对象的powershell

如何检索和删除嵌入式文档Spring Data MongoDB

使用Java在MongoDB中的嵌入式文档中索引和搜索“数组”

使用C#获取和添加/更新多层嵌入式/嵌套MongoDB文档

如何使用mongoDB和spring数据在嵌入式文档中创建id

MongoDB嵌入式文档:大小限制和聚合性能问题

MongoDB updateOne() 和 $set:{}

MongoDB嵌入式文档数组:仅获取一个具有特定属性的嵌入式文档

具有Aspnet身份和资源所有者的嵌入式IdentityServer 4

具有NFS引导和SSH的嵌入式Linux板

具有多种消息类型的嵌入式 RTOS 生产者和消费者

具有嵌入式和ng内容子项的不同ChangeDetectionStrategy.OnPush行为

具有多个定义的嵌入式C和AVR GCC编译问题

具有嵌入式 Tomcat 和通用名称 (CN) 的双向 TLS

使用MongoDB和C#新驱动程序版本(2.0)更新集合中的嵌入式文档

使用MongoDB和C#新驱动程序版本(2.0)更新嵌入式文档属性

MongoDB:检索、过滤和排序 MongoDB 嵌入式集合

Mongodb node.js 查询嵌入式文档具有多个值的单个字段。

带有Jersey和嵌入式Jetty的CrossOriginFilter