Arrays Mongodb查询以查找字段中嵌套数组或对象的元素值类型

Arrays Mongodb查询以查找字段中嵌套数组或对象的元素值类型,arrays,mongodb,object,types,Arrays,Mongodb,Object,Types,我有一个mongodb数据模型,其中有一些数组字段包含嵌入的对象或数组。由于我调整了我的应用程序逻辑,我在讨论的领域中有一些不一致之处。最初,我的模型是这样的: 结果收集的初始设置 "competition" : "competition1", "stats" : [ { "stat1" : [], "stat2" : [] } ] "competition" : "competition1", "stats" : [ {

我有一个mongodb数据模型,其中有一些数组字段包含嵌入的对象或数组。由于我调整了我的应用程序逻辑,我在讨论的领域中有一些不一致之处。最初,我的模型是这样的:

结果收集的初始设置

"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : [],
        "stat2" : []
    }
]
"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : 3,
        "stat2" : 2
    }
 ]
然而,我发现这并不是满足我需求的最佳设置。因此,我将其更改为以下内容:

结果收集的新设置

"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : [],
        "stat2" : []
    }
]
"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : 3,
        "stat2" : 2
    }
 ]
我现在的问题是,具有初始设置的文档会导致错误。所以我想要的是找到所有具有初始设置的文档,并将它们转换为具有新设置

我如何在mongodb中实现这一点

这是我尝试过的,但我被卡住了

db.getCollection('results').find({"stats.0": { "$exists": true }})
但是我想要的是能够做一些像

db.getCollection('results').find({"stats.0".stat1: { "$type": Array}})
基本上,我希望获取stats[0]的值为array类型的文档,并将整个stats字段重写为空数组

这将修复我遇到的错误。

旧版本中的数组运算符的工作原理与您可能认为的3.6中的略有不同

这将在3.6中起作用

db.getCollection('results').find( { "stats.0.stat1" : { $type: "array" } } )
对于较低版本,您可以通过两种方式来实现,这取决于您正在寻找什么

对于空数组,您只需检查

{"stats.0.stat1":{$size:0}}
对于非空数组

{"stats.0.stat1": {$elemMatch:{ "$exists": true }}}
使用
$或
组合这两种方法以查找空数组和非空数组

对于您的用例,您可以使用下面的更新

db.getCollection('results').update({"stats.0.stat1":{$size:0}}, {$set:{"stats":[]}})