在 mongodb 中查找并更新多级嵌套查询
find and update in mongodb for multilevel nested query
我的文档结构如下
{
"_id": {
"$oid": "55ae24016fb73f6ac7c2d640"
},
"Name": "some name",
"District": "some district",
"Stories": [
{
"userId": "105304831528398207103",
"story": "some story",
"Likes": ["user id 1" ..... ],
"_id": {
"$oid": "55c055af1875b0002572cf94"
}
}
]
}
现在当用户喜欢一个故事时,我想将他的用户 ID 添加到数组 Likes
我尝试了以下代码
router.post("/NewStoryLike", function (req, res) {
var mongo = require('mongodb');
var db = require('monk');
var ObjectID = mongo.ObjectID;
req.db.get('clnTemple').findAndModify({
query: { "_id": ObjectID(req.body.postId) ,"Stories._id": ObjectID(req.body.storyId) },
update: { $addToSet: { Likes: req.body.userId } },
upsert: true
});
res.send("Like Added");
});
它没有抛出任何错误,但它没有将用户 ID 添加到 likes 数组,而是在顶层添加了一个 Likes,即它添加到 post 级别
应该做出什么改变?
所以使用嵌套数组对设计来说是个坏主意。这是因为您可以在 MongoDB 中使用数组更新进行操作的限制。正如 positional $
update 运算符的文档中所述:
Nested Arrays
The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value
不过 $push|$addToSet
完全没问题,您实际匹配的唯一数组 是 外部数组,因此“第一个”数组元素匹配。只要你的命名正确:
req.db.get('clnTemple').findAndModify({
{
"_id": req.body.postId ,
"Stories._id": ObjectID(req.body.storyId),
},
{ "$addToSet": { "Stories.$.Likes": req.body.userId } },
{ "new": true },
function(err,doc) {
// updted doc in here
}
);
除此之外你真的不应该使用嵌套数组,这会工作得很好,因为它只是附加到匹配的“外部”数组的“内部”数组。
作为个人喜好,我对“喜欢”的建模更加不同,也更加可靠。但那是另一个问题了。
我的文档结构如下
{
"_id": {
"$oid": "55ae24016fb73f6ac7c2d640"
},
"Name": "some name",
"District": "some district",
"Stories": [
{
"userId": "105304831528398207103",
"story": "some story",
"Likes": ["user id 1" ..... ],
"_id": {
"$oid": "55c055af1875b0002572cf94"
}
}
]
}
现在当用户喜欢一个故事时,我想将他的用户 ID 添加到数组 Likes
我尝试了以下代码
router.post("/NewStoryLike", function (req, res) {
var mongo = require('mongodb');
var db = require('monk');
var ObjectID = mongo.ObjectID;
req.db.get('clnTemple').findAndModify({
query: { "_id": ObjectID(req.body.postId) ,"Stories._id": ObjectID(req.body.storyId) },
update: { $addToSet: { Likes: req.body.userId } },
upsert: true
});
res.send("Like Added");
});
它没有抛出任何错误,但它没有将用户 ID 添加到 likes 数组,而是在顶层添加了一个 Likes,即它添加到 post 级别
应该做出什么改变?
所以使用嵌套数组对设计来说是个坏主意。这是因为您可以在 MongoDB 中使用数组更新进行操作的限制。正如 positional $
update 运算符的文档中所述:
Nested Arrays
The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value
不过 $push|$addToSet
完全没问题,您实际匹配的唯一数组 是 外部数组,因此“第一个”数组元素匹配。只要你的命名正确:
req.db.get('clnTemple').findAndModify({
{
"_id": req.body.postId ,
"Stories._id": ObjectID(req.body.storyId),
},
{ "$addToSet": { "Stories.$.Likes": req.body.userId } },
{ "new": true },
function(err,doc) {
// updted doc in here
}
);
除此之外你真的不应该使用嵌套数组,这会工作得很好,因为它只是附加到匹配的“外部”数组的“内部”数组。
作为个人喜好,我对“喜欢”的建模更加不同,也更加可靠。但那是另一个问题了。