我正在为后端使用Node、Mongoose和Socket.io构建一个持久的html字段框架。在猫鼬的更新方法中,我遇到了一个似乎是错误的地方。
蒙戈的文件是这样的:
{
"_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中,查询的$ne部分应该导致它不返回要更新的匹配项。
我已经确认,使用相同的查询执行find不返回MongoDB命令行上的文档和使用Mongoose自己的Schema.find方法,但是Schema.update方法仍然找到文档并插入重复的lock子文档。
我是疯了,还是有什么原因让Mongoose的find方法不会检索文档,而update会检索文档呢?
发布于 2015-02-07 00:33:45
在使用MongoDB的查询分析器后,我发现Mongoose在执行更新查询时正在切换lock的unique_values对象中的键的顺序,然后按正确的顺序插入重复的子文档和键。因此,显然MongoDB的$ne操作符只有在子文档中的键与查询的顺序相同的情况下才会匹配嵌套的子文档数组。
发布于 2015-02-06 22:13:18
问题是,您正在查询一个对象是否与子文档匹配,这可能很棘手。在查询中,要使用$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'
]
}
}它基本上是对数组内部文档的查询。
https://stackoverflow.com/questions/28375353
复制相似问题