Как мне написать mongodb-запросы, включая такие условия, как «любой из одного вложенного документа совпадает с любым другим вложенным документом?»
Например, скажем, у меня есть такая структура:
{
personNumber: 3,
dataSet1:
[
{ date: new Date(2018,4,1), // ... }
{ date: new Date(2018,5,1), // ... }
],
dataSet2:
[
{ fromDate: new Date(2018,3,1), toDate: new Date(2018,5,1), //... }
{ fromDate: new Date(2018,7,1), toDate: new Date(2018,7,2), //... }
]
}
Как выполнять запросы, такие как:
- Люди, у которых есть элемент dataSet1, с датой, которая попадает между fromDate и toDate любого элемента их dataSet2 И
- Люди, которыеесть элемент dataSet2, который НЕ имеет элемента dataSet1 с датой, которая попадает между fromDate и toDate?
На основании некоторой информации, которую я нашел, я попытался это сделать:
db.test.find(
{
$expr:
{
$and:
[
{ $gt: [ "$dataSet1.date", "$dataSet2.fromDate" ] },
{ $lt: [ "$dataSet1.date", "$dataSet2.toDate" ] }
]
}
}
);
Но это, кажется, всегда возвращает 0 результатов.Если я удаляю и получаю что-то:
db.test.find(
{
$expr:
{
$gt: [ "$dataSet1.date", "$dataSet2.fromDate" ]
}
}
);
, что заставляет меня подозревать, что формат и неправильный, или мне нужно каким-то образом использовать elemMatch.
Но тогда я все равноне знаю, как идти о второй части - там, где нет совпадения.Есть ли хороший способ делать такие запросы в mongodb?