我有一个看起来像这样的文件:
{
"_id" : ObjectId("50a8240b927d5d8b5891743c"),
"cust_id" : "abc",
"ord_date" : ISODate("2012-10-03T18:30:00Z"),
"status" : "A",
"price" : 25,
"items" : [
{
"sku" : "mmm",
"qty" : 5,
"price" : 2.5
},
{
"sku" : "nnn",
"qty" : 5,
"price" : 2.5
}]
}
现在我想使用$where
查询"qty">5
和"sku"=='mmm'
,
I tried the following
{
"$where" : "this.items.some(function(entry){return entry.qty>5})&&this.items.some(function(entry){return entry.sku=='ggg'})
}
但它不起作用。我想只使用“$ where”
来做答案 0 :(得分:1)
使用$where
您可以使用if
创建一个for循环,您可以在其中设置条件。如果条件满足,它将返回true
:
db.col_t.find(
{
$where: "for (var i = 0; i < this.items.length; ++i) { if (this.items[i].sku === 'mmm' && this.items[i].qty > 5) return true; }"
}).pretty();
或者更短的直接输入$where
的值,如下:
db.col_t.find("for (var i = 0; i < this.items.length; ++i) { if (this.items[i].sku === 'mmm' && this.items[i].qty > 5) return true; }").pretty();
我建议您以这种方式使用$elemMatch
和$gt
:
查询:
{
items: {
$elemMatch: {
qty: { $gt: 5 },
sku: "mmm"
}
}
}
警告:此查询不会检索您的文档,因为使用$gt
它会搜索比>
更大的数字(5
)。如果您需要$gte
,请使用>=
。
参考文献:
$elemMatch
$ elemMatch运算符匹配数组元素中的多个组件
$gte
语法:
{field: {$gte: value} }
$gte
选择字段值大于或等于的文档(即>=
)指定值(例如值。)
$gt
语法:
{field: {$gt: value} }
$gt
选择字段值大于(即&gt;)指定值的文档。