真的堅持查詢嵌套在模式中的陣列。
串列架構如下所示:
const listSchema = new mongoose.Schema({
name: String,
items: [cardSchema]
});
我希望能夠查詢特定專案的特定串列,并認為這會起作用:
const listId = req.body.listId;
const itemId = req.body.itemId;
List.updateOne({
"_id": listId
}, {
$pull: {
items: {
"_id": itemId
}
}
});
據我了解,我正在通過“listId”的 id 更新串列,然后從中洗掉一些內容。我要洗掉的東西在“items”陣列中,id 為“itemId”。但是,這沒有任何作用。
我有一個更笨拙、更嚴厲的方法來解決這個問題,如下所示:
List.findOne({
_id: listId
}, function (err, list) {
if (err) {
console.log(err)
} else {
const listItems = list.items
listItems.forEach(function (item) {
if (item._id == itemId) {
const index = listItems.findIndex(function (i) {
return i.id === itemId
})
if (index !== -1) listItems.splice(index, 1);
list.save();
}
})
}
但我更喜歡前者。當在陣列中的陣列中嵌套陣列時,后者似乎很可笑,所以我知道這不是明智的方法。
uj5u.com熱心網友回復:
我最終找到了解決方案:
List.findOne({listId}, function (err, list) {
list.items.id(itemId).remove();
list.save();
});
uj5u.com熱心網友回復:
鑒于以下架構:
const listSchema = new mongoose.Schema({
name: String,
items: [cardSchema]
});
以及以下 ID:
const listId = req.body.listId;
const itemId = req.body.itemId;
如果您的最終目標是使用 洗掉專案itemId,我相信下面的代碼應該可以解決問題:
List.findOneAndUpdate(
{ "_id": listId },
{ $pull: { items: { _id: itemId} } },
{ 'new': true }
);
核心思想是這樣的:
Collection.findOneAndUpdate(
{ _id: yourCollectionId },
{ $pull: { subdocumentsArray: { _id: subdocumentId} } },
{ new: true }
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/336686.html
