【发布时间】:2015-04-07 03:51:48
【问题描述】:
我正在为后端使用 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 }
}
);
第一次插入完全符合预期,在包含唯一值 {merchant_warehouse_id: 11.1,product_item_id: 5334} 的数组中没有 locks,因此找到了文档并插入了 lock 子文档。
但是,第二次运行相同的更新不应该插入新的locks 子文档,因为已经存在具有相同unique_values 的子文档,并且查询的$ne 部分应该会导致它返回没有匹配的更新。
我已经确认使用相同的查询执行 find 在 MongoDB 命令行和使用 Mongoose 自己的 Schema.find 方法时都不会返回任何文档,但 Schema.update 方法仍然会找到一个文档并插入一个重复的 @987654334 @子文档。
我是不是快疯了,还是有什么原因导致 Mongoose 的 find 方法无法检索文档而 update 会检索到文档?
【问题讨论】:
标签: node.js mongodb mongoose socket.io