我正在为后端使用Node,Mongoose和Socket.io构建一个持久的html字段框架。我遇到了Mongoose更新方法中的错误。
mongo中的文档如下所示:
{
"_id" : "pickable_qty",
"currently_connected" : [ ],
"locks" : [
{
socket_id: 'eQYVyz1z28rJZRPpAAAB',
unique_values:{
merchant_warehouse_id: 11.1,
product_item_id: 5555
}
},
{
socket_id: 'eQYVyz1z28rJZRPpAAAB',
unique_values:{
merchant_warehouse_id: 11.2,
product_item_id: 5555
}
},
{
socket_id: 'eQYVyz1z28rJZRPpAAAB',
unique_values:{
merchant_warehouse_id: 11.1,
product_item_id: 1234
}
}
],
"definition" : {
"ajax_url" : "/persistent-fields/pickable_qty",
"unique_keys" : [
"product_item_id",
"merchant_warehouse_id"
],
"max_idle_seconds" : 30,
"field_type" : "text"
},
"__v" : 0
}
当我开始将子文档插入locks
数组时,会出现问题。
我使用Mongoose的update
方法插入它们,如下所示:
FieldSchema.update(
{
_id: 'pickable_qty',
'locks.unique_values': {
'$ne': {
merchant_warehouse_id: 11.1,
product_item_id: 5334
}
},
'definition.unique_keys': {
'$all': [
'merchant_warehouse_id',
'product_item_id'
]
}
},
{
'$push': {
locks: {
socket_id: 'eQYVyz1z28rJZRPpAAAB',
unique_values: {
merchant_warehouse_id: 11.1,
product_item_id: 5334
}
}
}
},
function(err, count, res){
console.log('err:', err, 'count:', count, 'res:', res);
//err: null count: 1 res: { ok: true, n: 1, updatedExisting: true }
}
);
第一个插件完全按预期工作,数组中没有locks
包含唯一值{merchant_warehouse_id: 11.1,product_item_id: 5334}
,因此找到了文档并插入了lock
子文档。
但是,第二次运行同一更新不应插入新的locks
子文档,因为已存在同一unique_values
的{{1}},查询的$ne
部分应该使其返回没有匹配要更新。
我已经确认使用相同的查询执行find
不会在MongoDB命令行上使用Mongoose自己的Schema.find
方法返回任何文档,但Schema.update
方法仍会找到文档并插入一个重复的lock
子目录。
我是否只是疯了,或者有没有理由说明为什么Mongoose的find
方法会在update
期间无法检索文档?
答案 0 :(得分:0)
问题是您正在查询对象是否与子文档匹配,这可能很棘手。您想要做的是在查询中使用$ elemMatch和$ ne的组合。
var query = {
_id: 'pickable_qty',
'locks': {
$elemMatch: {
merchant_warehouse_id: {
$ne: 11.1
},
product_item_id: {
$ne: 5334
}
}
},
'definition.unique_keys': {
'$all': [
'merchant_warehouse_id',
'product_item_id'
]
}
}
它基本上是对数组内部文档的查询。
答案 1 :(得分:0)
在使用MongoDB的查询分析器之后,我发现Mongoose在执行更新查询时正在切换lock
的{{1}}对象中的键的顺序。然后它以正确的顺序插入重复的子文档和键。显然,只有当子文档中的键与查询的顺序相同时,MongoDB的unique_values
运算符才会匹配嵌套的子文档数组。