因此,我对理解Mongo .create
和.findAndUpdate
操作的工作方式有疑问。我有猫鼬5.4.2X和一个具有模式的模型,该模式具有许多key:value
对(没有任何嵌套对象)的确切顺序(在下面的代码中,我使用1. 2. 3. etc显示)像这样)
let schema = new mongoose.Schema({
1.code: {
type: String,
required: true
},
2.realm: {
type: String,
required: true,
},
3.type: {
type: String,
required: true,
enum: ['D', 'M'],
},
4.open: Number,
5.open_size: Number,
6.key: typeof value,..
7...another one key: value like previous one,
8.VaR_size: Number,
9.date: {
type: Date,
default: Date.now,
required: true
}
});
和class
对象,它们具有以相同顺序完全相同的属性 。
当我通过const contract = new Class_name (data)
并使用console.log(contract)
为Mongo形成数据时,我有一个必需的对象,其属性以完全正确的顺序显示,例如:
Contract {1.code: XXX, 2.realm: YYY, 3.type: D, .... 8.VaR_size: 12, 9.date: 327438}
,但是当我尝试通过findOneAndUpdate
或(findByID)将文档创建/更新到数据库时,它以字母顺序书写,但不是必需的1-> 9,例如:
_id:5ca3ed3f4a547d4e88ee55ec
1.code:"RVBD-02.J"
7.VaR:0.9
(not the 1->9)...:...
8.VaR_size:0.22
__v:0
5.avg:169921
用于编写的完整代码段为:
let test = await contracts.findOneAndUpdate(
{
code: `${item_ticker}-${moment().subtract(1, 'day').format('DD.MMM')}` //how to find
},
contract, //document for writinng and options below
{
upsert : true,
new: true,
setDefaultsOnInsert: true,
runValidators: true,
lean: true
}
).exec();
是的,我已阅读过猫鼬文档,但未找到任何选项参数 解决我的问题或一些可选的参数很重要,但是 没有对此的描述。
这不是我的第一个项目,有趣的是,当我插入 根据模式插入了
.insertMany
个文档中的大量文档 顺序(不是字母顺序)
我唯一的问题是:
我该如何解决?是否有任何选项参数,或者它是
findAnd....
的一部分 操作?如果没有解决方案,那对我来说应该怎么办 必需正确排序并检查文件是否存在 插入吗?
一段时间后我更新了#1,我重新搜索了google搜索查询,并在此处找到有关SW的相关问题:MongoDB field order and document position change after update
答案 0 :(得分:0)
猜猜我根据我之前发布的链接找到了正确的答案。是的,它是MongoDB的一部分:
MongoDB根据特定的填充为新文档分配空间 因子。如果您的更新使文档的大小超出了 最初分配给文档的尺寸将被移动到 采集。相同的概念适用于文档中的字段。
通过@ {Bernie Hackett
但是在这个有用的评论中,仍然没有解决办法,对吗?错误。看来,避免这种情况的唯一方法是在Model.find
阶段使用附加的可选参数。在project
阶段通过.aggregate
使用相同的顺序,看起来像这样:
Model.find({query},{
"field_one":1,
"field_two":1,
.............
"field_last":1
});