Используйте оператор And для выполнения запроса с несколькими фильтрами - PullRequest
0 голосов
/ 15 мая 2018

Я использую MongoDB 3.2 и хочу сделать запрос из C #, используя официальный драйвер .NET (2.6)

Используйте Robomongo, чтобы выполнить поиск, и правильный запрос:

db.getCollection('collection1').find({ $and: [ { type: "ws128" }, { tsend: { $gte: ISODate("2018-05-11T14:39:33.000Z"), $lt: ISODate("2018-05-11T14:39:40.000Z") } }  ] })

Я хочу найти все документы, которые имеют ключ type = ws128 и переменная tsend находится между двумя датами , показанными в запросе.

В C # у меня есть фильтры, определенные как показано ниже, но я не знаю, как выполнить запрос:

DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);
var filter1 = Builders<BsonDocument>.Filter.Eq("type", "ws128");
var filter2 = Builders<BsonDocument>.Filter.Gte("tsend", datetimeend);
var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimestart);

С одним фильтром поиск выполнялся без проблем, как показано ниже, но я не знаю, как включить 3 фильтра.

var cursor = collection.Find(filter1).ToCursor();

Может ли кто-нибудь помочь мне продолжить? Спасибо! С уважением,

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

использовать один &

DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);
var filter1 = Builders<BsonDocument>.Filter.Eq("type", "ws128");
var filter2 = Builders<BsonDocument>.Filter.Gte("tsend", datetimeend);
var filter3 = Builders<BsonDocument>.Filter.Lt("tsend", datetimestart);
var andFilter = filter1 & filter2 & filter3;

var cursor = collection.Find(andFilter).ToCursor();

Я бы, наверное, написал этот код немного по-другому. Мне легче читать и писать:

DateTime datetimestart =  new DateTime(2018, 5, 11, 14, 39, 33);
DateTime datetimeend =  new DateTime(2018, 5, 11, 14, 39, 40);

var builder = Builders<BsonDocument>.Filter;
var filter1 = builder.Eq("type", "ws128");
var filter2 = builder.Gte("tsend", datetimeend);
var filter3 = builder.Lt("tsend", datetimestart);

var cursor = collection.Find(filter1 & filter2 & filter3).ToCursor();
0 голосов
/ 15 мая 2018

Вы можете просто сделать:

collection.Find(filter1 & filter2 & filter3)

или альтернативно:

collection.Find(Builders<BsonDocument>.Filter.And(filter1, filter2, filter3))
...