如何使用MongoDB和C#驱动程序查询数组是空还是空?

时间:2012-06-13 19:48:01

标签: c# linq mongodb mongodb-.net-driver

背景

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

据我所知,查找空数组的C#Driver查询是:

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

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

// 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#Driver方法来查询数组是否为空?
  2. 或者,检查数组是空还是空的最佳方法是什么?
  3. 对此有任何帮助将不胜感激! :)

4 个答案:

答案 0 :(得分:13)

您正在寻找$ size运算符。

如果数组为空,

Query.Size("myArray", 0)将为真。

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

答案 1 :(得分:5)

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

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

所以,在这种情况下。它应该是两个标准的OR条件:1。字段:空2.字段大小= 0;

{“$或”:[{“MyArray”:{“$ size”:0}},{“MyArray”:null}]}

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

请注意,$size can't use indexes$or也有一些index related limitations。我发现以下是查询具有空数组或非设置数组的文档的好方法,同时避免了$或$ size的限制。它也很短! :)

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