6

背景:

如果记录上的特定数组为空或为空,我需要完成的是删除集合中的任何记录。

我了解查找空数组的 C# 驱动程序查询是:

IMongoQuery query = Query.Exists("myArray", false);

这对于检测空数组很好,但有时数组不会为空,但不会有任何元素。我需要的更像是:

// Note: second subquery will not work
IMongoQuery query = Query.Or(
    Query.Exists("myArray", false),
    Query.IsEmpty("myArray", false) // error
);

模型:

我的课看起来像:

public class MyClass
{
    // This property may be null or empty
    [BsonElement("myArray")]
    public string[] MyArray { get; set; }

    [BsonElement("someElement")]
    public int SomeElement{ get; set; }

}

概括:

  1. 我应该使用什么 C# 驱动程序方法来查询数组是否为空?
  2. 或者,检查数组是否为空或为空的最佳方法是什么?

对此的任何帮助将不胜感激!:)

4

4 回答 4

14

您正在寻找 $size 运算符。

Query.Size("myArray", 0)如果数组为空,则为真。

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

于 2012-06-13T21:02:45.543 回答
5

$exists 仅匹配不存在的字段。如果一个字段存在,但它的值为 null (BSON null),那么这些字段与 $exists 不匹配。http://docs.mongodb.org/manual/reference/operator/query/exists/

但是,在两种情况下都检查字段值是否与空匹配:该字段不存在,并且该字段值为空。http://docs.mongodb.org/manual/faq/developers/#faq-developers-query-for-nulls

所以,在这种情况下。它应该是两个条件的 OR 条件: 1. field: null 2. field size =0;

{ "$or" : [ { "MyArray" : { "$size" : 0}} , { "MyArray" : null }]}

于 2014-02-19T05:08:20.693 回答
5

请注意,$size 不能使用索引并且$or也有一些与索引相关的限制。我发现以下是查询具有空数组或未设置数组的文档的好方法,同时避免了 $or 和 $size 的限制。而且还很短!:)

{myArray: {$in: [null, []]}}

于 2017-11-09T03:33:23.873 回答
3

要在 MongoDb 集合中查找空白数组字段,请在 Mongo shell 中使用以下查询 db.COLLECTION.find({ myArray: [] }).pretty();

使用您的数据库集合名称更改 COLLECTION。

于 2015-04-10T06:50:58.680 回答