У меня есть две коллекции в 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)
кто-нибудь, помогите мне решить эту проблему.Спасибо.