我正在尝试从产品阵列中删除产品没有费率的所有产品。在我下面的查询中,我试图检查费率数组的长度,但是 他们似乎都没有工作。任何帮助表示赞赏。
提前致谢
var ProductRateSchema = new Schema({
product: {
type: Schema.ObjectId,
ref: 'products'
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
rates: [{
type: Schema.ObjectId,
ref: 'rates'
}]
});
var InventorySchema = new Schema({
name: {
type: String,
default: '',
required: 'Please enter in a name',
trim: true
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
products: [productRateSchema]
});
var inventoryId = req.body.inventoryId;
var productId = req.body.productId;
// none of these queries work
db.inventory.findOneAndUpdate({ '_id': inventoryId,
{$pull: {'products': { product: productId, 'rates': { $eq:[] }}}}, function (err, result) {
});
db.inventory.findOneAndUpdate({ '_id': inventoryId,
{$pull: {'products': { product: productId, 'rates': {$size: {$lt: 1}}}}}, function (err, result) {
});
db.inventory.findOneAndUpdate({ '_id': inventoryId,
{$pull: {'products': { product: productId, 'rates': null }}}, function (err, result) {
});
答案 0 :(得分:1)
不知道您尝试了什么,因为它根本没有包含在您的问题中,但检查空数组的最佳方法是基本查看0
索引不匹配的位置{{3 }}:
Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
"查询" .update()
语句的一部分确保我们甚至只尝试触摸"products.rates"
中具有空数组的文档。这不是必需的,但它确实避免测试以下"更新"对于任何数组元素的条件不是true
的文档的语句条件,从而使事情变得更快。
实际"更新"部分在"products"
数组上应用$exists
以删除其中任何"内部" "rates"
是一个空数组。所以"路径" $pull
内的"products"
实际上是在查看$pull
内容,所以它与此相关,而不是整个文档。
当然<p:layoutUnit collapsible="true" gutter="1"> </p:layoutUnit>
将删除在单个操作中匹配的所有元素。仅当您确实要使用语句
$pull