У меня в базе есть следующая коллекция

{
    "_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, которые правильно выбирают 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
KrystianK 5 Дек 2018 в 09:59

1 ответ

Лучший ответ

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

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"
}
1
venoel 5 Дек 2018 в 09:00