在MongoDB中如何查找属性为object但不包含Array的文档

时间:2015-04-20 12:23:23

标签: mongodb

我有集合users,其中每个集合都包含属性gyms,例如:

{
    "_id" : ObjectId("aaaaa"),
    "firstName" : "first",
    "lastName" : "second",
    "email" : "aaa@aaaa",
    "password" : "aaaaa",
    "gyms" : [
        {
            "name" : "aaaaaa",
            "address" : "aaaaaaaaaaaaa"
        }
    ]
}

然而,当我运行db.users.aggregate(..)时,我得到了:

exception: Value at end of $unwind field path '$gyms' must be an Array, but is a Object

似乎有些用户文档包含gym:{}或者根本没有健身房而不是数组。我需要找到这些文件,我该怎么做?

编辑:

我运行的聚合命令:

db.users.aggregate({ $unwind: "$gyms" }, { $match: { "gyms.address": { $exists: true } } } )

3 个答案:

答案 0 :(得分:0)

试试这可能也会帮助你

db.users.aggregate([{
  "$match": {
      "$nor": [{
          "gyms": {
              "$exists": false
          }
      }, {
          "gyms": {
              "$size": 0
          }
      }, {
          "gyms": {
              "$size": 1
          }
      }]
  }
 }, {
  "$unwind": "$gyms"
}]).pretty()

答案 1 :(得分:0)

使用{$type: "object"}可以获得包含带数组的文档的结果。因此,要检查纯对象,只需添加额外的检查以确保丢弃数组,即obj.0.key: {$exists: false}

在你的情况下,

db.users.find({"gyms": {$type: object}, "gyms.0.name": {$exists: false}}).map(function(u) {
    // modify u.gyms to your satisfaction
    db.conversations.save(c);
})

答案 2 :(得分:-1)

尝试这样的事情:

> db.test.drop()
> db.test.insert({ "x" : ["an array"] })
> db.test.insert({ "x" : { "type" : "object" } })
> db.test.find({ "x" : { "$type" : 3 } })
{ "x" : { "type" : "object" } }