【问题标题】:How do you query a MongoDB document where an array attribute is null or of zero length?如何查询数组属性为空或长度为零的 MongoDB 文档?
【发布时间】:2014-10-05 17:24:52
【问题描述】:

我希望能够查询数组属性为空或长度为零的文档。我试过使用 $or,比如

{ things : { $or : [null, { $size : 0 } ] } }

但 MongoDB 抱怨它:

{ "$err" : "invalid operator: $or", "code" : 10068 }

似乎 MongoDB 不想在数组属性上使用 $and 或 $or。我认为简单地查询 { things : { $size : 0 } } 会返回具有零长度的非空数组和空数组的文档,但这似乎不是真的。

如何发出查询以查找数组属性为空或长度为零的所有文档?

【问题讨论】:

  • 好的,根据到目前为止的两个回答,我认为我的问题并没有我可以说的那么清楚。 things 实际上是文档的属性,而不是文档本身。 IOW,如果集合是'雅皮士',那么我想查询非典型雅皮士,即没有任何东西的雅皮士,这三种状态都意味着一个雅皮士没有东西:带有no things 属性、具有things 属性的雅皮士文档为null,以及具有things 属性为[] 的雅皮士文档(一个空数组)。这会让问题更清楚吗?

标签: arrays mongodb size


【解决方案1】:

thingsnull 时,它不是Array 类型。它的类型为Null,它是它自己的数据类型。 $size 只匹配数组。任何字段与数组不同的文档都不会被它匹配。

您的语法错误在于您使用the $or operator 的方式。你不将它用于一个字段,你将它作为一个字段使用。

db.collection.find({
   $or: [
       { things: { $size: 0 } },  // 0-elements array
       { things: null }           // field which is null
   ]
});

【讨论】:

    【解决方案2】:

    您也可以使用$in

    db.test.find({things: {$in: [null, []]}})
    

    这还将包括带有things: [null] 的文档。

    另一种方法是在things 数组的第一个元素上使用$exists

    db.test.find({'things.0': {$exists: false}})
    

    这将找到things 至少没有一个元素的文档。与上述相反,它仍将包含带有things: nullthings: [] 的文档,但 things: [null]

    【讨论】:

    • 这也适用于 mongo shell。我也会看到在猫鼬中这样做......
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2018-06-15
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多