在猫鼬中排序

Posted

技术标签:

【中文标题】在猫鼬中排序【英文标题】:Sorting in mongoose 【发布时间】:2020-11-21 06:50:51 【问题描述】:

好吧,这很奇怪,但排序不起作用。它不会抛出任何错误,但排序不起作用。

try 
    properties = await Property.find().sort("-minimumPrice");
 
   catch (err) 
   console.log(err)
  

我也试过了,但效果不佳:

try 
    properties = await Property.find().sort(minimumPrice: "desc");
 
   catch (err) 
   console.log(err)
  

【问题讨论】:

是的。还是不行。整个排序的事情都不起作用 我的数据: name: property1 minimumPrice: 4000, name: property2 minimumPrice: 8000 现在预期的结果应该是,应该先返回 property2 【参考方案1】:

请参阅here 了解有关排序和 here 是关于 mongoose async/await 的一些不错的官方文档

您应该使用 .exec() 和 await 以获得更好的堆栈跟踪,排序可以采用以下值:ascdescascendingdescending1-1

try 
    let properties = await Property.find(query).sort("minimumPrice": -1).exec() 
 catch (err) 
   console.log(err)

这一切都假设您的query 是正确的并且正在检索要排序的文档。

更新

我了解了你的整个情况,并使用你提供的内容创建了一个测试。

const mongoose = require("mongoose");
var Schema = mongoose.Schema;
var propertySchema = new Schema(
  name: String,
  minimumPrice: Number
);
var Property = mongoose.model('Property', propertySchema);

//Testing
(async function() 
  try 
    //connect to mongo
    await mongoose.connect('mongodb://localhost:27017/testing',  useNewUrlParser: true, useUnifiedTopology: true );

    //First, delete all properties
    await Property.deleteMany().exec();

    let properties = [];
    //Insert 5 properties
    for (var i = 1; i < 6; i++) 
      properties.push( name: "property" + i, minimumPrice: Math.round(Math.random() * 10000) );
    

    //Insert all our random properties
    await Property.create(properties);

    console.log(properties);

    //Now, retrieve all our properties
    let sortedProperties = await Property.find().sort( minimumPrice: -1 ).exec();

    console.log("sorted", sortedProperties);
   catch (err) 
    console.log(err);
  
)();

数据库输入:

[                                           
   name: 'property1', minimumPrice: 3846 ,
   name: 'property2', minimumPrice: 7910 ,
   name: 'property3', minimumPrice: 7234 ,
   name: 'property4', minimumPrice: 4444 ,
   name: 'property5', minimumPrice: 6366  
]                                           

排序输出:

[
  
    name: 'property2',
    minimumPrice: 7910
  ,
  
    name: 'property3',
    minimumPrice: 7234
  ,
  
    name: 'property5',
    minimumPrice: 6366
  ,
  
    name: 'property4',
    minimumPrice: 4444,
  ,
  
    name: 'property1',
    minimumPrice: 3846
  
]

您可以看到属性返回排序。这让我假设,您在某处插入了 minimumPrice 作为字符串。

【讨论】:

仍然无法正常工作。我试过 await Property.find().sort( minimumPrice: -1 ).exec();只是为了验证问题不是来自我使用 find 方法设置的查询参数 你使用的是哪个版本的 mongo 和 mongoose @pasoc30? 您是否可以将 minimumPrice 作为字符串插入? MongoDB can't sort by numbers stored as strings. 猫鼬 5.9.6。我正在使用地图集作为数据库。 不,我检查了三倍。数据类型为 int32

以上是关于在猫鼬中排序的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中,我如何按日期排序? (node.js)

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

在猫鼬中使用时“修剪”是啥意思?

在猫鼬中使用时“修剪”是啥意思?

在猫鼬中使用 geoNear