我有一个包含结构相似文档的mongo集合,如下图所示 -
{
"_id" : ObjectId("mongoid"),
"type" : "chemical",
"sourceId" : "27553452120",
"array1" : [
{
"cid" : "1235689",
"outcome" : "test",
"relation" : "=",
"array2" : [
{
"name" : "test1"
},
{
"name" : "test2"
},
{
"value" : 1.628,
"name" : "test3"
},
{
"value" : 1.63,
"name" : "test4"
}
]
}
]
}
我想查询此集合的案例,array1.array2.length > 1
我尝试在mongo shell上进行以下示例查询:
db.collection.find({"array1.array2":{$exists:true},$where:"this.array1.array2.length>1"}).limit(1).pretty()
但失败陈述
Error: error: {
"ok" : 0,
"errmsg" : "TypeError: this.array1.array2 is undefined :\n@:1:15\n",
"code" : 139,
"codeName" : "JSInterpreterFailure"
}
如何实现此查询?
答案 0 :(得分:0)
这可以解决您的问题。
db.test.aggregate(
{
$match:{"array1.array2": {$nin:[null,[]]}}
}
).pretty();
答案 1 :(得分:0)
试试这个
array
答案 2 :(得分:0)
根据上述问题的描述,请尝试执行以下聚合查询作为解决方案。
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
array1: {
$elemMatch: {
array2: {
$exists: true
}
}
}
}
},
// Stage 2
{
$project: {
array2size: {
$size: {
$arrayElemAt: ['$array1.array2', 0]
}
},
array1: 1
}
},
// Stage 3
{
$match: {
'array2size': {
$gt: 0
}
}
},
]
);
答案 3 :(得分:0)
这样:
db.test.find({"array1.array2.1":{$exists:1}})
这更灵活,它允许您查询任何长度,而不仅仅是1。
最后“.1”它是基于零的数组索引。因此,如果索引1存在,则意味着数组至少有2个元素。你可以搜索< N通过将$ exists更改为0.如果数组中没有索引3,则表示数组少于4个元素。
如果您需要搜索确切大小,可以使用$ size operator
db.test.find({"array1.array2":{$size:5}})