我所有的记录都有一个名为“图片”的字段。这个字段是一个字符串数组。

我现在想要最新的10条记录,其中这个数组不是空的。

我搜索了一下,但奇怪的是,我并没有在这方面找到太多。 我已经阅读了$where选项,但我想知道本机函数有多慢,如果有更好的解决方案。

即便如此,这也行不通:

ME.find({$where: 'this.pictures.length > 0'}).sort('-created').limit(10).execFind()

返回什么。离开这。没有长度位的图片也可以,但当然,它也会返回空记录。


当前回答

从2.6版本开始,另一种方法是将字段与空数组进行比较:

ME.find({pictures: {$gt: []}})

在外壳中进行测试:

> db.ME.insert([
{pictures: [1,2,3]},
{pictures: []},
{pictures: ['']},
{pictures: [0]},
{pictures: 1},
{foobar: 1}
])

> db.ME.find({pictures: {$gt: []}})
{ "_id": ObjectId("54d4d9ff96340090b6c1c4a7"), "pictures": [ 1, 2, 3 ] }
{ "_id": ObjectId("54d4d9ff96340090b6c1c4a9"), "pictures": [ "" ] }
{ "_id": ObjectId("54d4d9ff96340090b6c1c4aa"), "pictures": [ 0 ] }

因此,它正确地包含了其中pictures至少有一个数组元素的文档,并排除了其中pictures为空数组、不是数组或缺失的文档。

其他回答

检索所有且仅是'pictures'为数组且不为空的文档

ME.find({pictures: {$type: 'array', $ne: []}})

如果使用3.2之前的MongoDb版本,请使用$type: 4而不是$type: 'array'。注意,这个解决方案甚至没有使用$size,因此索引也没有问题(“查询不能为查询的$size部分使用索引”)

其他解决方案,包括以下(公认答案):

我。找到({图片:{$存在:真的,美元不是:{$大小:0}}}); 我。Find ({pictures: {$exists: true, $ne: []}})

是错误的,因为它们返回文档,例如,'pictures'是空的,未定义的,0等。

{ $where: "this.pictures.length > 1" }

使用$where并传递this.field_name。长度,返回数组字段的大小,并通过与number比较来检查它。如果任何数组有任何值,则数组大小必须至少为1。所有数组字段的长度都大于1,这意味着数组中有一些数据

使用$elemMatch操作符:根据文档

$elemMatch操作符匹配包含数组字段的文档,其中至少有一个元素与所有指定的查询条件匹配。

$elemMatches确保值是一个数组,并且它不是空的。所以这个查询是这样的

我。find({pictures: {$ elemMatch: {$exists: true}}}})

PS此代码的一个变体可以在MongoDB大学的M121课程中找到。

经过更多的寻找,特别是在mongodb文档中,和令人费解的片段在一起,这是答案:

ME.find({pictures: {$exists: true, $not: {$size: 0}}})

这可能对你也有用:

ME.find({'pictures.0': {$exists: true}});