0

我有用户的集合,其架构如下:

{
  _id: unique number,
  name: 'asdf',
  age: '12',
  gender: 'm',
  address: [
    {area: 'sdf',
     city: 'sdq', 
     state: 'wfw'},
    {area: 'asdf',
     city: 'sdfs',
     state: 'vfdwd'}
  ]
}

我想找出 in 的所有值都应该是我传递的值的state用户address。如果其中一个state值与我传递的值不匹配,则不应返回用户。我尝试了简单的查找、聚合框架$unwind$match但似乎没有任何解决方案。你能帮帮我吗...

谢谢

PS为了提问,请多多包涵。:)

4

2 回答 2

2

要确定所有数组条目是否与状态“wfw”匹配,请执行如下聚合:

db.users.aggregate([
    { "$project" : {
        "test" : {
            "$allElementsTrue" : [{
                "$map" : { 
                    "input" : "$address", 
                    "as" : "a", 
                    "in" : { "$eq" : ["wfw", "$$a.state"] }
                }
            }]
        }
    } },
    { "$match" : { "test" : true } }
])

该聚合获取每个文档,将“状态等于'wfw'”映射到地址数组以获得布尔数组,并测试整个数组是否为真,将结果存储在`test中,然后根据test过滤结果。您将需要 MongoDB 2.6 来支持某些运算符。

于 2014-12-10T17:31:05.773 回答
1

我不知道我是否明白。

我复制了你的文件。当您想通过state多种方式检索用户时

如果您使用单个值搜索,您可以这样做

db.g.find({ "address.state": "wfw" })

并检索用户

您可以使用$all

db.g.find( { "address.state": { $all: ["wfw","vfdwd"] } } ) // retrieve User

db.g.find( { "address.state": { $all: ["wfw","vfdwd","foo"] } } ) // don't retrieve User

或者你可以使用$and

db.g.find( { $and: [ { "address.state":"wfw" },{ "address.state":"vfdwd" }] } )

但我不知道我是否理解你的问题

更新和正确答案

db.g.find( { "address.state": { $nin: ["wfw"] } } )

让我知道

于 2014-12-10T15:38:59.210 回答