Неожиданный результат запроса mongodb? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть две коллекции в mongodb, и, используя $ match и $ sort, я извлекаю записи в базе данных. Я также использовал find().sort() с запросом, но результат, полученный в результате запроса, отличается.Сначала я выбираю записи из коллекции section, используя следующий запрос: -

запрос 1

db.section.find({"status":1}).sort({"display_order":1}).pretty()

Результат, полученный по вышеуказанному запросу: -

{ "_id" : 1, "name" : "name", "status" : 1 }
{ "_id" : 2, "name" : "email", "status" : 1 }

и Использование $lookup Я извлекаю запись из обоих объединений коллекции с помощью внешнего ключа, запрос выглядит так, как показано ниже: -

query 2

db.lead_section.aggregate([ 
  {$lookup: { "localField": "_id", 
              "from": "lead_field",   
              "foreignField": "lead_section_id", 
              "as": "custom_fields" }}, 
  {"$unwind": "$custom_fields"}, 
  {$match: {status: 1, "custom_fields.status": {$exists: true, $eq: 1}}}, 
  {"$sort": {"custom_fields.display_order": 1}}, 
  {"$group": { "_id":"$_id", "name":{"$first": "$name"}, 
               "status":{"$first": "$status"}, 
               "display_order": {"$first": "$display_order"},
               "custom_fields": {"$push": "$custom_fields"}}},
  {"$sort": {"display_order": 1}} ]).pretty()

Приведенный выше запрос выдаст результат, подобный

 {
  "_id" : 2,
  "name" : "email",
  "status" : 1,
  "display_order" : null,
  "custom_fields" : [
    {
        "_id" : 2,
        "lead_section_id" : 2,
        "name" : "email2",
        "status" : 1
    }
  ]
}
{
  "_id" : 1,
  "name" : "name",
  "status" : 1,
  "display_order" : null,
  "custom_fields" : [
    {
        "_id" : 1,
        "lead_section_id" : 1,
        "name" : "name2",
        "status" : 1
    }
  ]
}

Я также изменил запрос, как показано ниже

 db.lead_section.aggregate([ 
  {$lookup: { "localField": "_id", 
              "from": "lead_field",   
              "foreignField": "lead_section_id", 
              "as": "custom_fields" }}, 
  {"$unwind": "$custom_fields"}, 
  {$match: {status: 1, "custom_fields.status": {$exists: true, $eq: 1}}}, 
  {"$sort": {"custom_fields.display_order": 1}}, 
  {"$group": { "_id":"$_id", "name":{"$first": "$name"}, 
               "status":{"$first": "$status"},
               "custom_fields": {"$push": "$custom_fields"}}},
  {"$sort": {"display_order": 1}} ]).pretty()

Этот запрос удалит display_orderрезультат field и rest будет одинаковым.

В чем разница между запросами query 1 и query 2 и тем, как я получу одинаковый результат обоих запросов.

($sort with display_order is necessary)

кто-нибудь, помогите мне решить эту проблему.Спасибо.

1 Ответ

0 голосов
/ 26 февраля 2019

Я думаю, что сначала вы должны сохранить поле display_order со значением 0, а затем в запросе сначала нужно сделать db.section.find({"status":1}).sort({"display_order":1,"_id":1}).pretty()

Это означает, что если значение display_order существует, то оно будетсортируйте его с помощью display_order, либо он будет сортировать данные в соответствии с _id

такой же сортировкой в ​​запросе 2, как указано ниже: -

 db.lead_section.aggregate([ 
    {$lookup: { "localField": "_id", 
                "from": "lead_field", 
                "foreignField": "lead_section_id", 
                "as": "custom_fields" }}, 
    {"$unwind": "$custom_fields"}, 
    {$match: {status: 1, "custom_fields.status": {$exists: true, $eq: 1}}}, 
    {"$sort": {"custom_fields.display_order": 1}}, 
    {"$group": { "_id":"$_id", 
                 "name":{"$first": "$name"}, 
                 "status":{"$first": "$status"}, 
                 "display_order": {"$first": "$display_order"}, 
                 "custom_fields": {"$push": "$custom_fields"}}}, 
    {"$sort": {"display_order": 1, "_id":1}} ]).pretty()

Это будет работать для вас:)

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