Вопрос запроса MongoDB: как я должен выразить выборку, если одно поле имеет значение, а другое поле не задано? - PullRequest
1 голос
/ 24 апреля 2011

Я довольно новичок в Монго и не совсем понимаю:почему для следующих элементов в наборе test2 первый запрос работает, а второй - нет?И почему запрос дает мне только _id пользователя, а не все содержимое пользователя, в то время как он дает мне всю информацию, которая использует invites?

Запросы:

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})
db.test2.find({"invitations.code":"codeAA"}, {"invitations.acceptedDate": {$exists: false}})

Является ли это даже правильным способом выражения запроса в монго?Запрос, который я пытаюсь написать:

«Пожалуйста, дайте мне список пользователей, которые отправили приглашение, используя код« codeAA », где приглашение не было востребовано (приглашение не содержит acceptDate)»

Данные:

[{
    "username": "userA",
    "password": "secretA",
    "invitations": [{
        "code": "codeAA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeAB",
        "emailSentTo": "test@me.com",
        "acceptedDate": "20110424"
    }]},
{
    "username": "userB",
    "password": "secretB",
    "invitations": [{
        "code": "codeBA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeBB",
        "emailSentTo": "test@me.com",
    }]},
{
    "username": "userC",
    "password": "secretC",
    "invitations": [{
        "code": "codeCA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeAA",
        "emailSentTo": "test@me.com",
        "acceptedDate": "20110424"
    }]},
{
    "username": "userD",
    "password": "secretD",
    "invitations": [{
        "code": "codeDA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeDB",
        "emailSentTo": "test@me.com",
    }]
}]

Приветствия

Nik

Ответы [ 2 ]

5 голосов
/ 24 апреля 2011

Если вы посмотрите документы mongodb для метода поиска , вы увидите, что он ожидает ваш запрос в качестве первого аргумента и список полей, которые будут выбраны во втором.Таким образом, при первом вызове для поиска

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})

только "invitations.acceptedDate": {$exists: false} относится к вашему запросу, но {"invitations.code":"codeAA"} не является частью условия.Возможно, вы захотите поместить все свои условия в один объект запроса:

{
    "invitations.acceptedDate": {$exists: false},
    "invitations.code":"codeAA"
}

и передать его в качестве первого и единственного аргумента для поиска.

Возможно, вы получите только _id изпользователи, потому что вы как-то неправильно применили второй атрибут find.

Редактировать: Если вы хотите, чтобы документы с одним элементом массива соответствовали более чем одному условию, используйте $ elemMatch .Итак, на ваш вопрос:

«Пожалуйста, дайте мне список пользователей, которые отправили приглашение, используя код« codeAA », где приглашение не было востребовано (приглашение не содержит acceptDate)» *

ваш запрос должен выглядеть примерно так:

{
    invitations: {
        $elemMatch: {
            code: "codeAA",
            acceptedDate: {$exists: false}
        }
    }
}
2 голосов
/ 24 апреля 2011

Вы передаете фильтр поля в качестве второго параметра для поиска ().Завершенные запросы всегда передаются как первый параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...