我有1000个用户和用户数据如下所示。
有些用户将设备设为[{some data}]
(阵列),有些用户将设备设为{some data}
,有些用户将设备设为空[]
。
我需要使用mongodb查询来查找包含设备
{some data}
的用户列表。 以下是我的用户数据示例。
{
"_id" : ObjectId("56fe07bab95708fa18d45ac4"),
"username" : "abcd",
"devices" : []
},
{
"_id" : ObjectId("56fe07bab95708fa18d45df7"),
"username" : "efgh",
"devices" : [
{
"_id" : ObjectId("5827804ef659a60400e12fcb"),
"devicetype" : "web"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d45ae8"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("5951ea8b47abe300046ea26e"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d45b5b"),
"username" : "ijkl",
"devices" : [
{
"_id" : ObjectId("59bd2317eeff3200049a2ba6"),
"devicetype" : "ios"
"devicetoken" : "1abffaa4419d498b48d0bf982"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d46102"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("58c433da28841d00040d3cdb"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d46177"),
"username" : "efgh",
"devices" : {
"_id" : ObjectId("59d073d96974d20004a4bb9f"),
"devicetype" : "web"
}
},
{
"_id" : ObjectId("56fe07bab95708fa18d456c9"),
"username" : "ijkl",
"devices" : [
{
"_id" : ObjectId("59b93dd2e6673c00044cca49"),
"devicetype" : "ios"
"devicetoken" : "1abffaa4419d498b48d0bf982"
}
],
},
{
"_id" : ObjectId("56fe07bab95708fa18d456f4"),
"username" : "abcd",
"devices" : []
}
答案 0 :(得分:3)
您可以像这样使用$type
运算符
db.collection.find( { "devices" : { $type : "object" } } );
或
db.collection.find({ "devices": { $not: { $type: "array" } }})
答案 1 :(得分:2)
<强>更新强>:
根据您的要求尝试以下查询之一(删除空对象或仅保留空对象):
db.device.find( {$and:[ {devices:{ $type : "object" }},{devices:{$not: { $type: "array" }}}], devices:{$ne:{}}} );
db.device.find( {$and:[ {devices:{ $type : "object" }},{devices:{$not: { $type: "array" }}}], devices:{$eq:{}}} );
此外,请注意您的数据集中有重复的密钥(_id
),这意味着这些数据集未插入到您的数据库中。所以查询显然不会给出正确的结果。
修改强>: OP从数据集中删除了重复的密钥。
答案 2 :(得分:1)
您可以使用$type
运算符。
在此链接https://docs.mongodb.com/manual/reference/operator/query/type/
上查找更多详情