我有一个多级架构,我正在尝试使用$运算符在深层次的列表中添加元素。
我的架构看起来像这样,我正在尝试将对象添加到特定的cList:
var cSchema = mongoose.Schema({c:String,
cList[
{
d1:String
d2:String
}
]
});
var bSchema = mongoose.Schema({c:String,
b:String,
bList:[cSchema]
});
var aSchema = mongoose.Schema({
a:String,
aList:[bSchema]
});
我尝试运行以下命令,但count始终返回0:
Model.update( {_id:req.aid, "aList._id":req.params.bid, "bList.$.cList._id":req.params.cid},
{'$addToSet' : {'aList.$.bList.$.cList': req.body}},
function(err,count){
}
);
答案 0 :(得分:5)
$ operator用于更新运算符对象(update
的第二个参数),不查询选择器(第一个参数)。在查询选择器中,应该能使用aList.bList.cList._id
,这样aList.$.bList.$.cList
就可以与更新中嵌入的cList
的第一个匹配元素相对应操作
修改强>
目前不支持嵌套位置($
)运算符匹配。 This ticket显示了很久以前(2010年!)对这个功能的需求,但显然mongoDB中的低级代码并没有使这成为可能。似乎10gen希望在2.6版本中获得此功能。
您似乎必须单独查询和更新以使用当前架构实现此目标,或者可能将架构更改为更平坦。