在mongodb中查询嵌入文档数组

时间:2015-06-14 22:26:19

标签: mongodb embedded-documents

我在编写一个需要将给定值与数组中所有嵌入文档中的某个字段进行比较的查询时遇到一些麻烦。我将举一个例子,使问题不那么抽象。

假设我想使用MongoDB存储我网络上的用户输入到不同在线搜索引擎的最后查询。集合中的条目将具有如下结构:

{
    '_id' : 'zinfandel', 
    'last_search' : [
        {
            'engine' : 'google.com',
            'query' : 'why is the sky blue' 
        },
        {
            'engine' : 'bing.com', 
            'query' : 'what is love'
        },
        {   'engine' : 'yahoo.com',
            'query' : 'how to tie a tie'
        }
    ]
}

现在假设用户用户名将新的查询输入到某个引擎中。在DB中存储此查询的代码需要确定是否已存在用户使用的引擎条目。如果是,则使用新查询更新此条目。如果不是,则应创建新条目。我的想法是只有在给定引擎没有条目的情况下才进行$push,否则进行$set。为此,我试着写下这样的推文:

db.mycollection.update(
    { '_id' : username , search.$.engine : { '$ne' : engine } },
    { '$push' : { 'search.$.engine' : engine, 'search.$.query' : query } }
) 

但是,即使已经存在给定引擎的条目,也会推送新的嵌入式文档。问题似乎是$ne运算符不能像我期望的那样使用数组。我需要的是一种方法,以确保数组中的不是单个嵌入文档具有与指定引擎匹配的“引擎”条目。

有谁知道该怎么做?如果我需要进一步澄清问题,请告诉我......

1 个答案:

答案 0 :(得分:1)

您可以使用以下命令将项目推送到数组中:

db.mycollection.update({
    _id: "zinfandel", 
    "last_search.engine": {
        $nin: ["notwellknownengine.com"]
    }
}, {
    $push: {
        "last_search": {
            "engine" : "notwellknownengine.com", 
            "query" : "stackoveflow.com"
        }
    }
});