Монго Агрегированный запрос - объедините два запроса AND - PullRequest
0 голосов
/ 05 декабря 2018

В моей базе данных есть следующая коллекция

{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "2Z00CInO",
    "firstid" : "markt1995",
    "secondid" : "ninee87"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "fl981nhg",
    "firstid" : "violentee9",
    "secondid" : "markt1995"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "birk8mn",
    "firstid" : "eve1992",
    "secondid" : "toms78"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2015",
    "identifier" : "09man1l",
    "firstid" : "markt1995",
    "secondid" : "eve1992"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2017",
    "identifier" : "8h06KnO",
    "firstid" : "markt1995",
    "secondid" : "zepp988"
}

Мой желаемый результат:

  1. Все документы, в которых поля 'firstid' и 'secondid' являются одними изИдентификаторы документа И поле 'year' больше или равно 2018

  2. И 'firstid' + 'secondid' оба одновременно в документе И поле 'year' больше или равно 2015

У меня есть $ match stage, которые правильно выбирают 1. и 2., но я не могу объединить их, чтобы получить его в одном выводе.

Есть мои значения дляпеременные из запроса, я использую nodejs:

var firstid = markt1995

var secondid = eve1992

Существует запрос $ match для извлечения документов из первого критерия

$match: {
            $and: [{
              $or: [{
                  'firstid': {
                    "$in": [firstid, secondid]
                  }
                },
                {
                  'secondid': {
                    "$in": [firstid, secondid]
                  }
                }
              ],
              $and: [{
                'year': {
                  $gte: 2018
                }
              }],
            }]
    }

вывод:

{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "2Z00CInO",
    "firstid" : "markt1995",
    "secondid" : "ninee87"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "fl981nhg",
    "firstid" : "violentee9",
    "secondid" : "markt1995"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "birk8mn",
    "firstid" : "eve1992",
    "secondid" : "toms78"
}

Существует запрос $ match для извлечения документов из второго критерия

$and: [{
              $or: [{
                'firstid': {
                  "$in": [firstid, secondid]
                },
                'secondid': {
                  "$in": [firstid, secondid]
                }
              }],
              $and: [{
                'year': {
                  $gte: 2015
                }
              }]

          }]

вывод:

{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2015",
    "identifier" : "09man1l",
    "firstid" : "markt1995",
    "secondid" : "eve1992"
}

Требуемый выводв одном запросе:

{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "2Z00CInO",
    "firstid" : "markt1995",
    "secondid" : "ninee87"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "fl981nhg",
    "firstid" : "violentee9",
    "secondid" : "markt1995"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2018",
    "identifier" : "birk8mn",
    "firstid" : "eve1992",
    "secondid" : "toms78"
},
{
    "_id" : ObjectId("5bdba3101efdd9172de0b52f"),
    "year" : "2015",
    "identifier" : "09man1l",
    "firstid" : "markt1995",
    "secondid" : "eve1992"
}

1 Ответ

0 голосов
/ 05 декабря 2018

Почему бы вам не совместить два условия?

var firstid = 'markt1995';
var secondid = 'eve1992';
var a = [firstid,secondid ]
var c1 = {year:{$gte:2018},$or:[{firstid:{$in:a}},{secondid:{$in:a}}]};
var c2 = {year:{$gte:2015},firstid:{$in:a},secondid:{$in:a}};
db.getCollection('stack1').find(
    {$or:[c1,c2]}
)

Ответ

/* 1 */
{
    "_id" : ObjectId("5c078dd0410f22947d29dddc"),
    "year" : 2018,
    "identifier" : "2Z00CInO",
    "firstid" : "markt1995",
    "secondid" : "ninee87"
}

/* 2 */
{
    "_id" : ObjectId("5c078dd0410f22947d29dddd"),
    "year" : 2018.0,
    "identifier" : "fl981nhg",
    "firstid" : "violentee9",
    "secondid" : "markt1995"
}

/* 3 */
{
    "_id" : ObjectId("5c078dd0410f22947d29ddde"),
    "year" : 2018.0,
    "identifier" : "birk8mn",
    "firstid" : "eve1992",
    "secondid" : "toms78"
}

/* 4 */
{
    "_id" : ObjectId("5c078dd0410f22947d29dddf"),
    "year" : 2015,
    "identifier" : "09man1l",
    "firstid" : "markt1995",
    "secondid" : "eve1992"
}
...