Фильтр MongoDB для проверки, не является ли двоичное поле пустым - PullRequest
1 голос
/ 13 марта 2019

У меня есть длинный двоичный объект (сохраненный PNG на самом деле с миниатюрой) в MongoDB.Мне нужен фильтр, который будет возвращать всех слагов с непустым блобом.

Я пробовал что-то вроде этого:

var f = Builders<Common.Json.Database.Picture>.Filter.Where(pic => pic.ContentMini.Length > 0 && pic.ContentFull.Length > 0);
var p = Builders<Common.Json.Database.Picture>.Projection.Include(x => x.Slug);
var s = Builders<Common.Json.Database.Picture>.Sort.Ascending(x => x.Slug);

return Collections.Pictures.Find(f)
                            .Project<Common.Json.Database.Picture>(p)
                            .Sort(s)
                            .ToList()
                            .Select(x => x.Slug);

Но это возвращает пустой набор.Если я изменю Filter на Filter.Empty, я получу все слизни в моей коллекции.

Определение коллекции будет ниже:

[System.Serializable]
public class Picture
{
    [BsonId]
    [JsonIgnore]
    [NonSerialized]
    public ObjectId InternalId;

    [BsonElement("slug")]
    [JsonProperty("slug")]
    public string Slug;

    [BsonElement("author")]
    [JsonProperty("author")]
    public Common.Author Author;

    [BsonElement("owner")]
    [BsonRepresentation(BsonType.String)]
    [JsonProperty("owner")]
    public Guid OwningUserOrGroup;

    [BsonElement("keywords")]
    [JsonProperty("keywords")]
    public List<string> Keywords = new List<string>();

    [BsonElement("last_updated")]
    [JsonProperty("last_updated")]
    public DateTime LastUpdated;

    [BsonElement("is_approved")]
    [JsonProperty("is_approved")]
    public bool IsApproved;

    [BsonElement("is_obsolete")]
    [JsonProperty("is_obsolete")]
    public bool IsObsolete;

    [BsonElement("content_mini")]
    [BsonRepresentation(BsonType.Binary)]
    [JsonIgnore]
    public byte[] ContentMini;

    [BsonElement("content_full")]
    [BsonRepresentation(BsonType.Binary)]
    [JsonIgnore]
    public byte[] ContentFull;
}

1 Ответ

1 голос
/ 13 марта 2019

Пустой byte массив сохраняется в MongoDB как "content_mini" : BinData(0,""), поэтому вы можете просто использовать $ne для построения запроса в оболочке Mongo

db.pictures.find( {"content_mini": { $ne: new BinData(0,"") } } )

Чтобы построить этот запрос в C #, вам нужен Builders универсальный тип и Ne метод. Чтобы отфильтровать все пустые массивы и значения null, используйте код ниже:

var filter = Builders<Picture>.Filter.Ne(f => f.ContentMini, new byte[] { });
var filter2 = Builders<Picture>.Filter.Ne(f => f.ContentMini, null);
var result = Col.Find(filter & filter2).ToList();

Вы не должны использовать Filter.Empty, потому что он фактически представляет пустой запрос, как db.col.find({}) в оболочке Mongo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...