Mongodb Mongoose模型数组位于另一个数组中对象的末尾,而不是数组的开头;)令人困惑的问题

Mongodb Mongoose模型数组位于另一个数组中对象的末尾,而不是数组的开头;)令人困惑的问题,mongodb,mongoose,Mongodb,Mongoose,在我的mongoose模型中,数组如何插入到另一个数组中,我遇到了一个问题。我的模型运行良好,我能够更新我的数据库。第一个数组是locationcategories[],在该数组中,我有另一个categoryitems[]数组。更新db时,categoryitems[]存储在对象的开头,但我需要存储在对象的结尾 我有这个模式模型: var Schema = mongoose.Schema; var locationSchema = new Schema({ locationname

在我的mongoose模型中,数组如何插入到另一个数组中,我遇到了一个问题。我的模型运行良好,我能够更新我的数据库。第一个数组是locationcategories[],在该数组中,我有另一个categoryitems[]数组。更新db时,categoryitems[]存储在对象的开头,但我需要存储在对象的结尾

我有这个模式模型:

  var Schema = mongoose.Schema;

var locationSchema = new Schema({
    locationname: String,
    locationdescription: String,       
    locationcategories: [{ categoryorder: Number, categoryname: String,        
    categoryitems: [] }]       
});    
var Location = mongoose.model('Location', locationSchema);
export default Location;
请注意分类项目的位置:[]在我的分类末尾

以下是我创建类别对象的代码:

Location.findByIdAndUpdate(
        { _id: data.location_id },
        {
            $push: {
                locationcategories: {
                    
                    categoryorder: data.category_order,
                    categoryname: data.category_name,
                    categorydescription: data.category_description,
                    categoryitems: []
                }
            }
        },
请注意分类项目的位置:[]在我的分类末尾

我在mongodshell中得到了这个:

           {
                    "categoryitems" : [ ],
                    "_id" : ObjectId("5f7d0d072b42a22490621a76"),
                    "categoryorder" : 4,
                    "categoryname" : "cat87",
                    "categorydescription" : "location of categoryitems"
            }
请注意分类项目[]的位置。它位于对象的开头而不是结尾

这就是问题所在。假设在category对象的末尾插入数组,但它位于categoryorder之前的顶部。这有什么原因吗?一开始我可以接受,但我只是对它的行为感到好奇。我做错什么了吗?或者这就是猫鼬模型的工作原理?还是mongodb插入问题


我很想弄明白。非常感谢您的帮助。

MongoDB服务器保留文档中的密钥顺序。这是因为文档存储为键值对列表(详细信息)。也就是说,如果插入的是完整的文档,那么驱动程序发送到服务器的任何内容都是您在查询时应该接收的文档

如果对单个字段执行操作,这些字段可能会重新排序。对于关键订单的任何保证,您必须查阅各个操作员的文档;我不记得在公开的文档中看到过这样的保证

当您对多个字段执行操作时,服务器可能会按照您指定的顺序应用更改,从而保留字段的顺序。再说一次,据我所知,这是不能保证的

在构造文档并将其发送到服务器时,以及从服务器检索文档并呈现文档时,客户机保留密钥顺序是一个单独的问题。编程语言在这方面的行为各不相同。例如,Ruby已经保留了很长时间的键顺序,Python最近才开始这样做,而Elixir目前没有(据我所知也没有)

javascript保留键顺序的问题将在中介绍。其行为似乎是:

  • ES2015保留密钥(属性)顺序
  • 以前版本的JS没有
然后,问题是应用程序在插入数据时使用哪种语言,以及mongo shell在检索数据时使用哪种语言


据我所知,mongo shell不符合ES2015标准,因此您在shell中看到密钥顺序不同的最可能原因是shell对它们进行了重新排序。如果您在ES2015环境中使用节点驱动程序查询数据,我希望您看到保留的键顺序。

谢谢d。很高兴我的模式模型没有问题:)有趣的主题。我将使用我的节点驱动程序查询数据,并查看它将如何返回对象。