MongoDB选择数组非空的所有位置,2个不同的结果

时间:2013-12-11 16:30:32

标签: arrays mongodb

我在mongo中找到了两种不同的语法,其中数组非空。我想这个问题的关键可能实际上是我的数据而不是查询,但是如果mongo正在做一些我不明白的空洞,我想在这里查看---选择文件的首选方式是什么'institution.tags'数组是[“填充”,“和”]不是[]?

第一个选项---检查数组的第0项是否存在:

> db.coll.find({'institution.tags.0': {'$exists':true}}).count()
7330

第二个选项---检查此列表字段是否为空:

> db.coll.find({'institution.tags': {"$ne":null}}).count()
28014

理论上,名为'institution.tags'的所有字段都是数组类型---我不希望任何字典类型,字符串或数字。但我确实看到了截然不同的重要性,所以我想知道我应该期待什么,以及哪种查询在语义上更好(它是按照我的想法做的)还是性能。

1 个答案:

答案 0 :(得分:0)

Mongo shell的以下代码段应该澄清您的问题:

> db.coll.insert({_id:1})
> db.coll.insert({_id:2, array: []})
> db.coll.insert({_id:3, array: ["entry"]})
> db.coll.insert({_id:4, array: "no_array"})
> db.coll.find().pretty()
{ "_id" : 1 }
{ "_id" : 2, "array" : [ ] }
{ "_id" : 3, "array" : [ "entry" ] }
{ "_id" : 4, "array" : "no_array" }
> db.coll.count({array: {$exists:true}})
3
> db.coll.count({array: {$ne:null}})
3
> db.coll.count({"array.0": {$exists:true}})
1
> db.coll.count({$and: [{$where: "Array.isArray(this.array)"}, {array: {$size: {$gt: 0}}}]})
1

您的第一个选项可能是正确的选择,但是如果您希望尽可能明确,请查看我的示例中使用$where to check the $type以及$size的最后一个查询。您的第二个选项只是检查该字段是否存在,您将不知道

  • 是否为数组
  • 或 - 如果是 - 是否为空